Опубликован: 30.01.2013 | Доступ: свободный | Студентов: 1292 / 162 | Длительность: 17:23:00
Теги: .net, ajax, asp, www, интранет
Лекция 9:

Способы увеличения производительности

Кэширование выходного потока

Кэширование – это сохранение результата во временном кэше с целью использования этого результата впоследствии при обработке последующих HTTP-запросов. Одной из разновидностей кэширования в ASP.NET является кэширование выходного потока, т.е. тех данных, которые передаются клиенту после обработки запроса. Таким образом, кэширование выходного потока позволяет задать режим, при котором вся информация, которая отдается клиенту (т.е. HTML) будет сохраняться в кэше. При последующих обращениях к этой же странице, HTML-код этой страницы будет изъят из кэша, при этом код страницы запущен не будет. Такой способ определения кэширования наиболее простой с точки зрения реализации. Для задания режима кэширования выходного потока нужно воспользоваться директивой страницы OutputCache, указав ее в разметке страницы. После этого, будет включен режим кэширования выходного потока.

Определение директивы OutputCache в странице выглядит следующим образом.


Как видно, определение директивы – это одна строка, которая задает необходимые параметры кэширования. После добавления такой директивы на страницу, при обращении к странице автоматически начинает работать кэширование выходного потока. В этом легко убедиться, если добавить на страницу постоянно изменяющийся элемент, который, например, отображает текущее время.


Код страницы выглядит при этом следующим образом.


В этом случае при первом обращении страница будет сохранена в кэше, а при последующих – изыматься из кэша; при этом программный код веб-формы исполняться не будет.

У директивы OutputCache обычно задаются два параметра – время жизни данных в кэше (Duration) и условие нахождения данных в кэше (одно из набора – VaryByParam, VaryByHeader, VaryByControl или VaryByCustom).

Параметр Duration определяет время жизни данных в кэше в секундах. Этот параметр связан с устареванием данных в кэше. Страница будет находиться в кэше ровно столько времени, сколько указано в этом параметре. Это означает, что при указании значения 60, кэш будет очищен (и страница обновлена) только по истечении 60 секунд после первого обращения.

При задании параметра VaryByParam указывается зависимость нахождения страницы в кэша от параметров, которые задаются в адресной строке (в случае использования HTTP-метода GET). Если значение параметра VaryByParam равно "none", то при любых значениях параметров в кэше в один момент времени содержится только одна копия страницы. При указании в этом параметре имени какого-либо параметра запроса, для каждого различного значения этого параметра создается отдельная копия страницы в кэше; также возможно указать несколько параметров. При указании данному параметру значения "*" учитываются все параметры, которые присутствуют в GET-запросе.

Например, если значение параметра VaryByParam равно "none", то при обращении к странице с любыми параметрами "Default.aspx?param=1", "Default.aspx?param=2", "Default.aspx?param=5" и т.д. в кэше будет создана единственная копия страницы, которая будет возвращаться каждый раз, пока не истечет время жизни, указанное в параметре Duration. Если в параметре VaryByParam указать "param" или "*", то при каждом различном значении параметра будет создана отдельная копия страницы в кэше.

Параметры VaryByHeader, VaryByControl и VaryByCustom работают аналогично, за тем исключением, что в них используются другие данные:

  • при задании VaryByHeader учитывается значение HTTP-заголовоков;
  • при задании VaryByControl учитывается состояние элемента управления;
  • при задании VaryByCustom используется собственный метод для определения кэширования, который должен возвращать строку. Другими словами, используя параметр VaryByCustom можно определить собственный алгоритм задания условия, в каких случаях создавать новую копию страницы в кэше. Например, в этом методе можно определить, что условием будет текущий web-браузер.

Не сложно догадаться, что при кэшировании выходного потока кэшируется вся страница целиком. Этот факт может стать проблемой, если на странице кроме кэшируемых данных содержатся данные, которые должны обновляться чаще, чем все остальное содержимое. В этом случае проблему можно решить двумя способами – использованием фрагментарного кэширования или послекэшевых подстановок.

Механизм фрагментарного кэширования подразумевает, что кэшироваться будет не вся страница, а только ее часть. Достигается это путем выделения части страницы в отдельный элемент управления, например UserControl, и задания ему параметров декларативного кэширования выходного потока. Настройка кэширования выходного потока не отличается от настройки кэширования для страницы.

Механизм послекэшевых подстановок подразумевает обратный фрагментарному кэшированию подход. В этом случае кэшируется вся страница, и лишь небольшая ее часть обновляется всегда. Для этих целей используется элемент управления Substitution, который имеет параметр MethodName. В этом параметре указывается имя статического метода, который исполняется всегда, даже когда страница находится в кэше. Результат выполнения данного метода помещается в ту часть страницы, где находится элемент управления Substitution. Метод объявляется статическим, т.к. если страница находится в кэше, то объект класса Page не создается, и обработка страницы не запускается. Этот метод имеет следующий вид.


Кэширование выходного потока в приложениях ASP.NET MVC Framework реализуются аналогичным образом. Однако, вместо использования директивы страницы, используется фильтр ASP.NET MVC Framework – OutputCache.


Параметры фильтра OutputCache аналогичны параметрам директивы страницы OutputCache.

Таким образом, можно без особых усилий, путем декларативного определения настроек, задать правила кэширования страницы.

Краткие итоги

Кэширование выходного потока – это одна из разновидностей кэширования, которая доступна в рамках ASP.NET. В случае кэширования выходного потока в кэше сохраняется результат генерации всей страницы. Для определения кэширования выходного потока используется директива страницы OutputCache, в которой задаются параметры кэширования. Если требуется кэшировать только часть страницы, то можно использовать фрагментарное кэширование (выделить часть страницы в элемент управления на основе UserControl и определить параметры кэширования для него) и послекэшевые подстановки. Для приложений на базе ASP.NET MVC Framework для определения кэширования используется фильтр OutputCache, который работает аналогичным образом.

Марина Воробьева
Марина Воробьева
Виктория Ткаченко
Виктория Ткаченко

Проигрыватель не работает. После нажатия кнопки Play ничего не происходит.