Декларативное кеширование - это один из возможных вариантов кеширования
данных в 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 и деструктором?