Кэширование частей страницы ASP.NET
Обновлен: Ноябрь 2007
Иногда нецелесообразно кэшировать страницу целиком, так как части страницы могут изменяться при каждом новом запросе. В таких случаях можно кэшировать только часть страницы. Для этого существует два способа: кэширование элементов управления и подстановка после кэширования.
При кэшировании элементов управления, которое также называется фрагментарным кэшированием, можно кэшировать части выходных данных страницы путем создания пользовательских элементов управления, в которых находится кэшируемое содержимое, а затем помечать эти пользовательские элементы управления как кэшируемые. Это позволяет кэшировать конкретное содержимое страницы, в то время как остальная часть страницы будет каждый раз создаваться заново. Например, при создании страницы, на которой отображается преимущественно динамическое содержимое (например, биржевые котировки), но также имеются статические разделы (например, еженедельные биржевые сводки), можно создать статические разделы в пользовательских элементах управления и настроить эти пользовательские элементы управления так, чтобы выполнялось их кэширование.
Подстановка после кэширования является противоположным по своему действию методом. Кэшируется вся страница, но некоторые фрагменты этой страницы являются динамическими и, следовательно, не должны кэшироваться. Например, если создать страницу, которая является полностью статической в течение установленного периода времени (например, страницу новостей), можно установить такой режим, при котором вся страница должна быть помещена в кэш. Если добавить на кэшируемую страницу чередующиеся рекламные объявления, они не будут изменяться в интервалах времени между запросами страницы. Тем не менее, при использовании подстановки после кэширования вся страница может кэшироваться целиком, однако при этом существует возможность пометить конкретные части этой страницы как некэшируемые. В рассматриваемом примере следует пометить рекламные объявления как некэшируемые. После этого они будут динамически создаваться для каждого запроса страницы и добавляться к кэшированным выходным данным страницы. Дополнительные сведения об использовании подстановки после кэширования см. в разделе Динамическое обновление части кэшированной страницы.
Кэширование элементов управления
Создание пользовательских элементов управления для кэширования содержимого позволяет отделить элементы страницы, на создание которых уходит ценное процессорное время, например запросы к базе данных, от остальных частей страницы. Части страницы, требующие минимальных ресурсов сервера, можно создавать динамически при каждом запросе страницы.
После идентификации тех частей страницы, которые следует кэшировать, и создания пользовательских элементов управления, которые будут содержать каждую из этих частей, следует определить политики кэширования пользовательских элементов управления. Эти политики можно задать декларативно, используя директиву @ OutputCache, или путем использования класса PartialCachingAttribute в коде пользовательского элемента управления.
Например, если в начало файла пользовательского элемента управления (файла с расширением ASCX) будет включена следующая директива, версия элемента управления будет храниться в кэше выходных данных 120 секунд.
<%@ OutputCache Duration="120" VaryByParam="None" %>
Если необходимо задать параметры кэширования в коде, можно использовать атрибут в объявлении класса пользовательского элемента управления. Например, если в метаданные объявления класса включить следующий атрибут, версия содержимого будет храниться в кэше выходных данных 120 секунд:
[PartialCaching(120)]
public partial class CachedControl : System.Web.UI.UserControl
{
// Class Code
}
<PartialCaching(120)> _
Partial Class CachedControl
Inherits System.Web.UI.UserControl
' Class Code
End Class
Дополнительные сведения об атрибутах, устанавливаемых для вывода страницы, см. в разделе @ OutputCache. Дополнительные сведения о разработке пользовательских элементов управления см. в разделе Общие сведения о серверных веб-элементах управления ASP.NET.
Примечание. |
---|
Поскольку на странице допускается вложение элементов управления, можно также вкладывать друг в друга пользовательские элементы управления, которые были помещены в кэш выходных данных. При этом можно определить отличающиеся друг от друга параметры кэширования страницы и параметры кэширования вложенных пользовательских элементов управления. |
Программное обращение к кэшированному пользовательскому элементу управления
При декларативном создании кэшируемого пользовательского элемента управления можно включить в него атрибут ID, чтобы обращаться к данному экземпляру пользовательского элемента управления программными средствами. Тем не менее, перед обращением к пользовательскому элементу управления в коде необходимо убедиться в наличии этого пользовательского элемента управления в кэше выходных данных. Кэшируемый пользовательский элемент управления динамически создается только при первом запросе; все последующие запросы до истечения указанного срока хранения элемента в кэше обслуживаются кэшем выходных данных. После того как факт создания экземпляра пользовательского элемента управления установлен, появляется возможность программно работать с этим элементом управления в составе содержащей его страницы. Так, например, если декларативно задать для свойства ID пользовательского элемента управления значение SampleUserControl, то факт его существования можно проверить при помощи следующего кода:
protected void Page_Load(object sender, EventArgs e)
{
if (SampleUserControl != null)
// Place code manipulating SampleUserControl here.
}
Protected Sub Page_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Load
If SampleUserControl <> Nothing Then
' Place code manipulating SampleUserControl here.
End If
End Sub
Кэширование страницы и пользовательских элементов управления на разный срок
Можно определить отличающиеся друг от друга значения длительности кэширования выходных данных для страницы и для пользовательских элементов управления на этой странице. Если длительность кэширования выходных данных страницы превышает длительность кэширования выходных данных элемента управления, значение длительности кэширования выходных данных страницы имеет более высокий приоритет. Так, например, если длительность кэширования выходных данных страницы равна 100 секундам, а пользовательский элемент управления кэшируется на срок в 50 секунд, то вся страница целиком, включая пользовательский элемент управления, будет сохраняться в кэше выходных данных в течении 100 секунд, несмотря на более короткий период кэширования пользовательского элемента управления.
В следующем примере кода демонстрируется влияние большей длительности кэширования страницы по сравнению со значением данного параметра для пользовательского элемента управления. Страница настроена на кэширование в течение 100 секунд.
<%@ Page language="C#" %>
<%@ Register tagprefix="SampleControl" tagname="Time" src="uc01.ascx" %>
<%@ OutputCache duration="100" varybyparam="none" %>
<SampleControl:Time runat="server" /><br /> <br /> <br />
This page was most recently generated at:<p>
<% DateTime t = DateTime.Now.ToString();
Response.Write(t); %>
<%@ Page language="VB" %>
<%@ Register tagprefix="SampleControl" tagname="Time" src="uc01.ascx" %>
<%@ OutputCache duration="100" varybyparam="none" %>
<SampleControl:Time runat="server" /><br /> <br /> <br />
This page was most recently generated at:<p>
<% Dim t As DateTime = DateTime.Now.ToString()
Response.Write(t) %>
В следующем примере кода показан пользовательский элемент управления, включенный в состав данной страницы. Длительность кэширования этого элемента управления устанавливается равной 50 секундам.
<% @Control language="C#" %>
<% @OutputCache duration="50" varybyparam="none" %>
This user control was most recently generated at:<p>
<% DateTime t = DateTime.Now.ToString();
Response.Write(t); %>
<% @Control language="VB" %>
<% @OutputCache duration="50" varybyparam="none" %>
This user control was most recently generated at:<p>
<% Dim t As DateTime = DateTime.Now.ToString()
Response.Write(t) %>
Если длительность кэширования выходных данных страницы меньше длительности кэширования пользовательского элемента управления, последний будет находиться в кэше до истечения своего срока хранения, и даже после того, как остальная часть страницы в результате очередного запроса будет создана вновь. Так, например, если срок кэширования выходных данных страницы составляет 50 секунд, а срок кэширования пользовательского элемента управления составляет 100 секунд, срок хранения элемента управления в кэше будет истекать вдвое реже срока хранения остальной части страницы.
Следующий код демонстрирует разметку страницы, которая содержит пользовательский элемент управления с большей длительностью кэширования по сравнению со значением данного параметра для страницы. Страница настроена на кэширование в течение 50 секунд.
<%@ Page language="C#" %>
<%@ Register tagprefix="SampleControl" tagname="Time" src="uc2.ascx" %>
<%@ OutputCache duration="50" varybyparam="none" %>
<SampleControl:Time runat="server" /><br /> <br /> <br />
This page was most recently generated at:<p>
<% DateTime t = DateTime.Now.ToString();
Response.Write(t); %>
<%@ Page language="VB" %>
<%@ Register tagprefix="SampleControl" tagname="Time" src="Uc2.ascx" %>
<%@ OutputCache duration="50" varybyparam="none" %>
<SampleControl:Time runat="server" /><br /> <br /> <br />
This page was most recently generated at:<p>
<% Dim t As DateTime = DateTime.Now.ToString()
Response.Write(t) %>
В следующем коде показан пользовательский элемент управления, включенный в состав данной страницы. Длительность кэширования этого элемента управления устанавливается равной 100 секундам.
<% @Control language="C#" %>
<% @OutputCache duration="100" varybyparam="none" %>
This user control was most recently generated at:<p>
<% DateTime t = DateTime.Now.ToString();
Response.Write(t); %>
<% @Control language="VB" %>
<% @OutputCache duration="100" varybyparam="none" %>
This user control was most recently generated at:<p>
<% Dim t As DateTime = DateTime.Now.ToString()
Response.Write(t) %>
См. также
Основные понятия
Общие сведения о кэшировании в ASP.NET
Динамическое обновление части кэшированной страницы
Кэширование нескольких версий страницы