26 May 2008

asp.net: описание механизма кэширования страниц через OutputCache

.NET
Одним из способов управления кэшированием страниц в asp.net является декларативный способ с помощью директивы <%@ OutputCache %>. Ниже приводится описание и исследование работы данной директивы. Большая часть сведений взята из msdn, но это не перевод, а скорее изложение. В тексте также присутствуют мои собственные исследования того, как тот или иной параметр влияет на http-заголовки.

Для указания кэширования страниц или пользовательских элементов управления используется директива
<%@ OutputCache %>. Обычно она указывается после директивы Page или Control.
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ResumeList.aspx.cs" Inherits="services_vacancies_ResumeList" %>

<%@ OutputCache Duration="60" VaryByParam="none" %>


<%@ OutputCache %> имеет несколько параметров:

CacheProfile


CacheProfile – этот параметр не обязателен и по умолчанию равен пустой строке. Этот параметр не может использоваться в файлах .ascx. CacheProfile используется для указания профиля кэширования заданного через web.config и секцию caching.
Пример:
В web.config задается секция caching
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name=«Cache30Seconds» duration=«30»
varyByParam=«none» />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
* This source code was highlighted with Source Code Highlighter.

Эта секция используется декларативно на странице, через CacheProfile
<%@ OutputCache CacheProfile=«Cache30Seconds» %>

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

Duration


Duration – это обязательный параметр. Duration задает значение времени в секундах, в течение которого страница или пользовательский элемент кэшируются. По сути, данный параметр определяет в http-заголовке ответа сервера для поля Cache-Control значение параметра max-age:

Cache-Control: public, max-age=60

Location


Location – этот параметр описывает правило для места хранения кэша и принимает одно из значений перечисления OutputCacheLocation. Этот параметр не может использоваться в файлах .ascx. По умолчанию Location установлен в OutputCacheLocation.Any. Ниже перечислены все возможные значения Location:

Any


кэш может хранится везде, в том числе у клиента, на сервере, на промежуточных прокси-серверах. Это значение определяет HTTP заголовок Cache-Control как public.

Client


кэш хранится на клиентской стороне. Это значение определяет HTTP заголовок Cache-Control как private.

Downstream


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

Cache-Control: public

Server


кэш хранится только на сервере где был обработан запрос. Это значение определяет HTTP заголовок Cache-Control как server. На самом деле после указания Location=”Server” в заголовке будет следующая информация:

Cache-Control: no-cache
Pragma: no-cache
Expires: -1

None


данное значение указывает, что страница или пользовательский элемент не подлежат кэшированию. Это значение определяет HTTP заголовок Cache-Control как nocache. Сформированный заголовок будет таким же, как и при использовании Server.

ServerAndClient


кэш может хранится только на сервере либо на клиентах, прокси-сервера не должны кэшировать содержимое. Это значение определяет HTTP заголовок Cache-Control как комбинацию значений private и server. На самом деле заголовок будет содержать:

Cache-Control: private
Vary: *

NoStore


NoStore принимает булево значение. Если значение равно true, то добавляет в директиву http-заголовка Cache-Control параметр no-store. Этот параметр не может использоваться в файлах .ascx. Этот параметр может быть полезен для предотвращения кэширования страниц в firefox (описано здесь aspadvice.com/blogs/rjdudley/archive/2006/04/07/16280.aspx).

Shared


Shared – этот параметр принимает булево значение и указывает, что пользовательский элемент управления может быть разделен с разными страницами. По умолчанию Shared=”false”. Этот параметр не может использоваться в файлах .aspx. По сути, включение данного параметра означает, что любая страница использующая ascx-файл сможет брать сохраненные данные из одного кэша. По умолчанию, для каждой страницы одинаковые ascx-файлы сохраняются в разных местах. В большинстве случаев включение данного параметра позволит сохранить память на сервере.

SqlDependency


SqlDependency – может содержать строку пар «база данных: таблица», от которых зависит кэширование.
<%@ OutputCache Duration=«3600» VaryByParam=«None» SqlDependency= «Northwind:Products;Northwind:Categories» %>
Подразумевается, что при обновлении указанных таблиц элементы (страница или пользовательский элемент управления) убираются из кэша. SqlDependency только для aspx может содержать значение CommandNotification, тогда необходимо через класс SqlDependency зарегистрировать уведомление.

VaryByContentEncoding


VaryByContentEncoding указывает условие кэширование в зависимости от содержимого директивы http-заголовка Accept-Encoding. Следующий пример позволит кэшировать страницы сжатые только gzip:

<%@ OutputCache Duration=«60» VaryByParam=«none» VaryByContentEncoding=«gzip» %>

VaryByControl


VaryByControl – указывает строку, которая содержит перечисление через точку с запятой ID элементов управления, которые подлежат кэшированию на сервере. Для директивы OutputCache обязателен этот атрибут либо VaryByParam. Этот атрибут добавляет в http-заголовок параметр Vary: *.

<%@ OutputCache Duration=«60» VaryByControl=«AddResumeCtrl;LoggerCtrl» %>

VaryByCustom


VaryByCustom – любой текст для управление кэшированием. Если этот текст равен «browser», то кэширование будет производиться условно по имени браузера и его версии (major version). Если у VaryByCustom будет указана строка, то вы обязаны переопределить метод GetVaryByCustomString в файле Global.asax для осуществления условного кэширования.

VaryByHeader


VaryByHeader – строка с разделенными через точку с запятой значениями http-заголовков по которым будет производиться условное кэширование. Этот параметр не может использоваться в файлах .ascx. Добавляет в http-заголовок параметр vary с соответствующим значением. Например, следующий код:

<%@ OutputCache Duration=«30» VaryByParam=«none» VaryByHeader=«Referer» %>

добавит в http-заголовок ответа:

Vary: Referer

но только при работе в паре с Location=«Downstream» или Location=«Any».

VaryByParam


VaryByParam – задает условное кэширование основанное на значениях строки запроса при GET или параметров при POST. Значения должны перечисляться через точку с запятой. Похоже, что условное кэширование происходит только на сервере, потому что вне зависимости от значения VaryByParam в http-заголовок Vary равен «*». VaryByParam – обязателен к указанию, если не задан атрибут VaryByControl. VaryByParam может быть равен «none» и тогда условного по параметрам кэширования не происходит, либо VaryByParam может быть равен «*» и тогда условное кэширование производится по всем параметрам.
Tags:asp.netкэширование
Hubs: .NET
+7
9k 21
Comments 7