Использование кэширования в Web-приложениях
Создадим копию пользовательского элемента управления ShowTime.ascx и назовем его ShowTime_cache.ascx. Установим для него режим кэширования. Для этого, так же как и в обычной HTML-странице, введем директиву
<%@ OutputCache Duration="5" VaryByParam="*" %>
Разместим элемент ShowTime_cache.ascx на странице и немного ее модифицируем для того, чтобы различать ранее созданный элемент, не поддерживающий кэширование, и только что созданный элемент ( рис. 9.5).
В результате после запуска приложения получим следующий результат ( рис. 9.6).
Рис. 9.6. Результат работы программы с использованием кэширующего и не кэширующего элементов управления
Еще одним из вариантов кэширования является кэширование пользовательского элемента управления, параметры которого задаются с помощью свойства класса. Для включения кэширования и установки длительности нахождения страницы в кэше в этом случае достаточно добавить свойство
[PartialCaching(20)] public partial class ShowTime : System.Web.UI.UserControl { }
Рис. 9.7. Добавление пользовательского элемента управления, параметры кэширования которого задаются с помощью свойств класса
Использование элемента управления Substitution для реализации фрагментного кэширования
Рассматривая примеры, приведенные выше, нетрудно заметить, что параметры кэширования для страницы, на которую помещаются элементы управления, не устанавливались. Это приводило к тому, что кэшировались только те элементы, для которых были установлены соответствующие параметры. Иногда бывает полезнее поступить наоборот: установить параметры кэширования для всей страницы, а для содержимого некоторых элементов сделать возможным отсутствие кэширования. В этом случае нужно воспользоваться элементом Substitution. Для работы этому элементу управления необходимо название статического метода, который возвращает динамическое содержимое, отображаемое на странице. Элемент Substitution может быть размещен на странице так же, как и любые другие элементы управления, что позволяет контролировать расположение его содержимого внутри страницы.
В качестве примера создадим новую Web-страницу. Установим для нее следующий параметр кэширования:
<%@ OutputCache Duration="10" VaryByParam="*" %>
Поместим на вновь созданную страницу элемент ShowTime.ascx, не осуществляющий кэширование, а также элемент Substitution, в качестве значения параметра MethodName которого установим GetTime. Это означает, что элемент Substitution при обращении к странице будет инициировать вызов процедуры GetTime. Эта процедура должна быть статической процедурой в составе класса страницы, возвращающей результат в виде строки. Именно возвращенное значение и будет подставлено в место расположения элемента Substitution. Код метода GetTime при этом может выглядеть следующим образом:
public static string GetTime(HttpContext context) { return "Текущее время:" + DateTime.Now.ToString("hh:mm:ss"); }
Результат выполнения данной страницы представлен на рис. 9.8. Как видно, содержимое страницы кэшируется, однако элемент Substitution выводит на экран текущее значение времени, параметры кэширования к которому не применяются.
Рассмотренные способы предоставляют возможность использовать встроенные в ASP.NET возможности кэширования. Тем не менее существует возможность использования собственного алгоритма кэширования данных, при котором в программном коде определяются принципы помещения и извлечения данных из кэша.
Краткие итоги
Web-приложения обладают хорошими показателями масштабируемости и производительности. Они рассчитаны на обслуживание большого количества пользователей. Однако ресурсы таких приложений не безграничны. Каждое обращение пользователя к Web-приложению требует использования ресурсов сервера или нескольких серверов. Особенно критично использование ресурсов постоянной и оперативной памяти сервера. Для уменьшения нагрузки на использование дисковой подсистемы сервера целесообразно использовать кэширование данных, т. е. организацию хранения в оперативной памяти сервера копий информации, создание которой связано с большими накладными расходами на ее получение и обработку. Тем не менее применение кэширования приводит к возникновению нескольких проблем. Одной из проблем является необходимость использования оперативной памяти сервера для использования кэширования. Таким образом, кэширование необходимо применять разумно, т. к. в противном случае оно способно приводить к потере производительности приложения.
ASP.NET поддерживает два типа кэширования: кэширование данных и кэширование вывода.
При использовании кэширования вывода сгенерированный в результате выполнения приложения HTML-код страницы сохраняется в памяти, и при повторном запросе этой же страницы клиенту передается уже сгенерированный код. Кэширование кода всей страницы не всегда бывает оправданным. В ASP.NET существует возможность кэширования части страницы - фрагментного кэширования.