Кеширование данных с помощью директивы OutputCache

Комментарии отсутствуют

Декларативное кеширование - это один из возможных вариантов кеширования данных в ASP.NET, построенный на использовании директивы OutputCache.
Данная директива может применяться для кеширования страниц и пользовательских элементов управления (User Control). Пример использования:
[code=ASPX]<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="CacheTest._Default" %>
<%@ OutputCache Duration="10" VaryByParam="None" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Test Page</title>

</head>
<body>
    <form id="form1" runat="server">
    <div>
        <%=DateTime.Now.ToString("G")%>
    </div>
    </form>
</body>
</html>
[/code]
Общий синтаксис OutputCache:

[code=xml]<%@ OutputCache Duration="#ofseconds"
Location="Any | Client | Downstream | Server | None | 
ServerAndClient "
Shared="True | False"
VaryByControl="controlname"
VaryByCustom="browser | customstring"
VaryByHeader="headers"
VaryByParam="parametername" 
VaryByContentEncoding="encodings"
CacheProfile="cache profile name | ''"
NoStore="true | false"
SqlDependency="database/table name pair | CommandNotification"
%>[/code]

Далее подробно будут рассмотрены атрибуты OutputCachе и их влияние на процесс кеширования.  

Атрибут Duration

Данный атрибут указывает на какое время (в секундах) страница будет помещена в кеш.

Примечание
Данный атрибут является обязательным.

Атрибут VaryByParam

ASP.NET может сохранять в кеше несколько копий одной странице в зависимости от параметров формы, строки запроса, HTTP-заголовков или определяемых параметров.
Атрибут VaryByParam управляет кешированием на основе параметров формы и строки запроса. Сдесь возможны неколько вариантов:
1. Если установить VaryByParam="None", то изменения параметров формы и строки запроса не будут учитываться при кешировании.
2. Если установить VaryByParam="*", то для разных параметров формы и строки запроса в кеше будут сохраняться новые копии страниц.
3. Возможно также указывать через запятую параметры строки запроса и формы

Атрибут Location

Этот атрибут указывает место хранение кешированной страницы. Возможны следующие варианты:
  • Any - кеш страницы может храниться везде, а именно: на клиенте, на сервере или на промежуточных прокси-серверах.
  • Client - кеш страницы хранится на клиентской стороне.
  • Server - кешированная информация хранится на сервере, что обрабатывает запрос.
  • DownStream - страница будет кешироваться на отправляещем сервере.
  • ServerAndClient - кеш страницы может буть сохранён как на сервере, так и на клиенте, но не на прокси-верверах.
  • None - кеширование не будет использоваться.
Примечание
Применяется только к страницам.

Атрибут Shared

Данный атрибут принимает булевое значение и может использоваться только для пользовательских элементов управления. Может быть полезен когда существуют несколько страниц, которые используют один UserControl. В случае применения Shared="true" для UserControl'a все страницы будут использовать один и тот же кеш.

Примечание
Применяется только к пользовательским элементам управления. По умолчанию установлен в false.

Атрибут CacheProfile

Позволяет указать профиль кеширования для страницы в web.config. Очень удобен в том случае, если существуют много страниц с одинаковыми настройками кеширования. Тогда если вдруг возникнет необходимость что-то поменять (например: увеличить время кеширования), вынеся предварительно профиль кешерования в web.config и присвоив его страницам, возможно быстро изменить настройки.
Пример web.config:[code=xml]<caching>
    <outputCacheSettings>
         <outputCacheProfiles>
              <add name="testCacheProfile" duration="10" varyByParam="None"/>
         </outputCacheProfiles>
    </outputCacheSettings>
</caching>[/code]Страница:[code=xml]<%@ OutputCache CacheProfile="testCacheProfile" %>[/code]Примечание
Применяется только к страницам.

Атрибут SqlDependency

Может содержать строку типа "[база даных]:[таблица],[база даных]:[таблица]...". При изменении данных в указанных таблицах страница или пользовательский элемент управления удаляются их кеша. Возможно также в атрибут SqlDependency установить значение CommandNotification, тогда через SqlDependency необходимо зарегистрировать уведомление об изменении данных.

Примечание
CommandNotification применяется только к страницам. Пользовательские элементы управления могут использовать кеширование на основе таблиц базы данных.

Атрибут VaryByControl

Указывает через ";" ID элементов управления, которые подлежат кешированию на сервере.

Примечание
Этот атрибут является обязательным, если не указывать VaryByParam. Возможно использовать как для страниц, так и для пользовательских элементов управления.

Атрибут VaryByCustom

Позволяет управлять кешированием страницы на основе параметров определённых разработчиком. Всё, что нужно сделать, - переопределить метод HttpApplication.GetVaryByCustomString в global.asax.
Пример функции:
[code=c#]public override string GetVaryByCustomString ( HttpContext context, string arg )
   switch ( arg )
      case "Frames":
         return "Frames = " + context.Request.Browser.Frames;
      case "JavaScript":
         return "JavaScript = " + context.Request.Browser.JavaScript;
      default:
         return "";
   }
}[/code]Пример страницы:
[code=xml]<%@ OutputCache VaryByCustom="Frames" Duration="5" VaryByParam="None" %>[/code]Если атрибут VaryByCustom="Browser", то базовая версия метода GetVaryByCustomString выполняет кеширование на основе имени браузера и версии (major version).

Атрибут VaryByHeader

Управляет кешированием на основе HTTP-заголовков. Может принимать одно или несколько, разделённых через запятую, значений:
  • Accept
  • Accept-Charset
  • Accept-Encoding
  • Accept-Language
  • Authorization
  • Content-Encoding
  • Expect
  • From
  • Host
  • If-Match
  • If-Modified-Since
  • If-None-Match
  • If-Range
  • If-Unmodified-Since
  • Max-Forwards
  • Proxy-Authorization
  • Range
  • Referer
  • TE
  • User-Agent
Пример:
[code=xml]<%@ OutputCache Duration=”100” VaryByHeader=”Referer;Content-Encoding” %> [/code]Новое представление страницы будет заносится в кеш при каждой уникальной паре значений заголовков Referer и Content-Encoding.

Примечание
Данный атрибут можно использовать только для страниц.

Атрибут VaryByContentEncoding

Указывает условие кеширования на основе HTTP-заголовка Accept-Encoding. Пример использования атрибута VaryByContentEncoding читаем в MSDN.


На заметку!
Возможно, это очевидно, для пользовательского элемента управления и страницы, что использует элемент управления, можно установить разные периоды кеширования. Что же произойдёт в данном случае? Расмотрим следующие варианты:
1. Страница кешируется на 100 секунд, а пользовательский элемент управления - 50 сек. В таком случае страница с пользовательским элементом управления будет кешироваться на 100 секунд.
2. Страница кешируется на 50 секунд, а пользовательский элемент управления - 100 сек. При таких раскладах кеш пользовательского элемента управления будет удаляться один раз, в то время как кеш страницы будет удаляться два раза на протяжении 100 сек.

Читаем также:

Как разница между методом Response.Redirect и Server.Transfer?

Как разница между методом Finalize и деструктором?