Поделиться через


Кэширование

от Корпорации Майкрософт

Понимание кэширования важно для высокопроизводительного приложения ASP.NET. ASP.NET 1.x предлагалось три различных варианта кэширования; кэширование выходных данных, кэширование фрагментов и API кэша.

Понимание кэширования важно для высокопроизводительного приложения ASP.NET. ASP.NET 1.x предлагалось три различных варианта кэширования; кэширование выходных данных, кэширование фрагментов и API кэша. ASP.NET 2.0 предлагает все три этих метода, но добавляет некоторые важные дополнительные функции. Существует несколько новых зависимостей кэша, и теперь у разработчиков есть возможность создавать пользовательские зависимости кэша. Конфигурация кэширования также была значительно улучшена в ASP.NET 2.0.

Новые возможности

Профили кэша

Профили кэша позволяют разработчикам определять определенные параметры кэша, которые затем можно применить к отдельным страницам. Например, если у вас есть страницы, срок действия которых истекает через 12 часов, можно легко создать профиль кэша, который можно применить к этим страницам. Чтобы добавить новый профиль кэша, используйте <раздел outputCacheSettings> в файле конфигурации. Например, ниже приведена конфигурация профиля кэша twoday , который настраивает длительность кэша в 12 часов.

<outputCacheSettings>
    <outputCacheProfiles>
        <add name="TwoDay" duration="43200" />
    </outputCacheProfiles>
</outputCacheSettings>

Чтобы применить этот профиль кэша к определенной странице, используйте атрибут CacheProfile директивы @ OutputCache, как показано ниже:

<%@ OutputCache CacheProfile="TwoDay" %>

Настраиваемые зависимости кэша

ASP.NET 1.x разработчики кричали о настраиваемых зависимостях кэша. В ASP.NET 1.x класс CacheDependency был запечатан, что не позволяло разработчикам создавать собственные классы от него. В ASP.NET 2.0 это ограничение удаляется, и разработчики могут разрабатывать собственные зависимости пользовательского кэша. Класс CacheDependency позволяет создавать настраиваемую зависимость кэша на основе файлов, каталогов или ключей кэша.

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

System.Web.Caching.CacheDependency dep = new
    System.Web.Caching.CacheDependency(Server.MapPath("stuff.xml"));
Response.AddCacheDependency(dep);
Cache.Insert("key", "value");

В этом сценарии при изменении файла stuff.xml кэшированный элемент становится недействительным.

Можно также создать настраиваемую зависимость кэша с помощью ключей кэша. При использовании этого метода удаление ключа кэша сделает кэшированные данные недействительными. Проиллюстрируем это на примере.

// insert a value into cache that will serve
// as the cache key
Cache["CacheKey"] = "something";

// create an array of cache keys
string[] keys = new String[1];
keys[0] = "CacheKey";

CacheDependency dep = new CacheDependency(null, keys);

// insert an item into cache with a dependency on
// the above CacheDependency
Cache.Insert("Key", "Value", dep);

Чтобы сделать недействительным элемент, который был вставлен выше, просто удалите элемент, который был вставлен в кэш, чтобы он действовал в качестве ключа кэша.

// Remove the cache item that serves as the cache key
Cache.Remove("CacheKey");

Обратите внимание, что ключ элемента, который выступает в качестве ключа кэша, должен совпадать со значением, добавленным в массив ключей кэша.

Polling-Based зависимости кэша SQL (также называются зависимостями Table-Based)

SQL Server 7 и 2000 используют модель на основе опроса для зависимостей кэша SQL. Модель на основе опроса использует триггер для таблицы базы данных, который активируется при изменении данных в таблице. Этот триггер обновляет поле changeId в таблице уведомлений, которое периодически ASP.NET проверки. Если поле changeId было обновлено, ASP.NET знает, что данные изменились, и делает кэшированные данные недействительными.

Примечание

SQL Server 2005 также может использовать модель на основе опроса, но так как модель на основе опроса не является наиболее эффективной, рекомендуется использовать модель на основе запросов (обсуждается далее) с SQL Server 2005.

Чтобы зависимость кэша SQL с использованием модели на основе опроса работала правильно, в таблицах должны быть включены уведомления. Это можно сделать программным способом с помощью класса SqlCacheDependencyAdmin или с помощью служебной программы aspnet_regsql.exe.

Следующая командная строка регистрирует таблицу Products в базе данных Northwind, расположенной в экземпляре SQL Server с именем dbase для зависимости кэша SQL.

aspnet_regsql -S dbase -ed -d Northwind -E -et -t Products

Ниже приведено описание параметров командной строки, используемых в приведенной выше команде.

Параметр командной строки Назначение
-S server Указывает имя сервера.
-Эд Указывает, что для базы данных должна быть включена зависимость кэша SQL.
-d database_name Указывает имя базы данных, которая должна быть включена для зависимости кэша SQL.
-E Указывает, что aspnet_regsql должны использовать проверка подлинности Windows при подключении к базе данных.
-Et Указывает, что мы включаем таблицу базы данных для зависимости кэша SQL.
-t table_name Указывает имя таблицы базы данных, включаемой для зависимости кэша SQL.

Примечание

Для aspnet_regsql.exe доступны и другие параметры. Чтобы получить полный список, выполните aspnet_regsql.exe -? из командной строки.

При выполнении этой команды в базу данных SQL Server вносятся следующие изменения:

  • Добавляется AspNet_SqlCacheTablesForChangeNotification таблица. Эта таблица содержит по одной строке для каждой таблицы в базе данных, для которой включена зависимость кэша SQL.
  • В базе данных создаются следующие хранимые процедуры:
AspNet_SqlCachePollingStoredProcedure Запрашивает AspNet_SqlCacheTablesForChangeNotification таблицу и возвращает все таблицы, для которых включена зависимость кэша SQL, и значение changeId для каждой таблицы. Этот хранимый прок используется для опроса, чтобы определить, изменились ли данные.
AspNet_SqlCacheQueryRegisteredTablesStoredProcedure Возвращает все таблицы, включенные для зависимости кэша SQL, запрашивая AspNet_SqlCacheTablesForChangeNotification таблицу и все таблицы, включенные для зависимости кэша SQL.
AspNet_SqlCacheRegisterTableStoredProcedure Регистрирует таблицу для зависимости кэша SQL, добавляя необходимую запись в таблицу уведомлений и добавляя триггер.
AspNet_SqlCacheUnRegisterTableStoredProcedure Отменяет регистрацию таблицы для зависимости кэша SQL, удалив запись в таблице уведомлений и удалив триггер.
AspNet_SqlCacheUpdateChangeIdStoredProcedure Обновления таблицу уведомлений путем увеличения changeId для измененной таблицы. ASP.NET использует это значение, чтобы определить, изменились ли данные. Как показано ниже, этот хранимый процесс выполняется триггером, созданным при включении таблицы.
  • Для таблицы создается триггер SQL Server с именем table_name_AspNet_SqlCacheNotification_Trigger. Этот триггер выполняет AspNet_SqlCacheUpdateChangeIdStoredProcedure при выполнении инструкций INSERT, UPDATE или DELETE для таблицы.
  • В базу данных добавляется роль SQL Server с именем aspnet_ChangeNotification_ReceiveNotificationsOnlyAccess.

Роль SQL Server aspnet_ChangeNotification_ReceiveNotificationsOnlyAccess имеет разрешения EXEC для AspNet_SqlCachePollingStoredProcedure. Чтобы модель опроса работала правильно, необходимо добавить учетную запись процесса в роль aspnet_ChangeNotification_ReceiveNotificationsOnlyAccess. Средство aspnet_regsql.exe не сделает этого за вас.

Настройка зависимостей кэша SQL Polling-Based

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

  • Настройка файла конфигурации ASP.NET.
  • Настройка SqlCacheDependency

Настройка файла конфигурации ASP.NET

Помимо добавления строки подключения, как описано в предыдущем модуле, необходимо также настроить элемент кэша <> с элементом <sqlCacheDependency>, как показано ниже:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name="Pubs"
    connectionString="Data Source=(local);
      Initial Catalog=pubs;Integrated Security=true;"
    providerName="System.Data.SqlClient" />
  </connectionStrings>
  <system.web>
    <caching>
      <sqlCacheDependency enabled = "true" pollTime = "60000" >
        <databases>
          <add name="pubs" connectionStringName = "pubs" pollTime = "9000000" />
        </databases>
      </sqlCacheDependency>
    </caching>
  </system.web>
</configuration>

Эта конфигурация включает зависимость кэша SQL от базы данных pubs . Обратите внимание, что атрибут pollTime в элементе <sqlCacheDependency> по умолчанию — 60 000 миллисекунда или 1 минута. (Это значение не может быть меньше 500 миллисекундами.) В этом примере <элемент add> добавляет новую базу данных и переопределяет параметр pollTime, устанавливая для него значение 9000000 миллисекунд.

Настройка SqlCacheDependency

Следующим шагом является настройка SqlCacheDependency. Самый простой способ сделать это — указать значение атрибута SqlDependency в директиве @ Outcache следующим образом:

<%@ OutputCache duration="60"
    VaryByParam="none" SqlDependency="pubs:authors" %>

В приведенной выше директиве @ OutputCache для таблицы авторов в базе данных pubs настраивается зависимость кэша SQL. Несколько зависимостей можно настроить, разделив их точкой с запятой следующим образом:

<%@ OutputCache duration="60"
    VaryByParam="none"
    SqlDependency="database_name:table_name;database_name:table_name" %>

Другой способ настройки SqlCacheDependency — это сделать это программным способом. Следующий код создает зависимость кэша SQL от таблицы авторов в базе данных pubs .

SqlCacheDependency dep = new SqlCacheDependency("pubs", "authors");

Одним из преимуществ программного определения зависимости кэша SQL является возможность обработки любых исключений, которые могут возникнуть. Например, при попытке определить зависимость кэша SQL для базы данных, для которого не включено уведомление, будет создано исключение DatabaseNotEnabledForNotificationException . В этом случае можно попытаться включить для базы данных уведомления, вызвав метод SqlCacheDependencyAdmin.EnableNotifications и передав ему имя базы данных.

Аналогичным образом при попытке определить зависимость кэша SQL для таблицы, для которого не включено уведомление, будет выдано исключение TableNotEnabledForNotificationException . Затем можно вызвать метод SqlCacheDependencyAdmin.EnableTableForNotifications , передав ему имя базы данных и имя таблицы.

В следующем примере кода показано, как правильно настроить обработку исключений при настройке зависимости кэша SQL.

try {
    SqlCacheDependency SqlDep = new
    SqlCacheDependency("pubs", "authors");
} catch (DatabaseNotEnabledForNotificationException exDBDis) {
    try {
        SqlCacheDependencyAdmin.EnableNotifications("pubs");
    } catch (UnauthorizedAccessException exPerm) {
        Response.Redirect("ErrorPage.htm");
    }
} catch (TableNotEnabledForNotificationException exTabDis) {
    try {
        SqlCacheDependencyAdmin.EnableTableForNotifications("pubs",
        "authors");
    } catch (System.Data.SqlClient.SqlException exc) {
        Response.Redirect("ErrorPage.htm");
    }
} finally {
    Cache.Insert("SqlSource", Source1, SqlDep);
}

Дополнительные сведения: https://msdn.microsoft.com/library/t9x04ed2.aspx

Query-Based зависимости кэша SQL (только SQL Server 2005)

При использовании SQL Server 2005 для зависимости кэша SQL модель на основе опроса не требуется. При использовании с SQL Server 2005 зависимости кэша SQL взаимодействуют напрямую через подключения SQL к экземпляру SQL Server (дальнейшая настройка не требуется) с помощью уведомлений о запросах SQL Server 2005.

Самый простой способ включить уведомление на основе запросов — сделать это декларативно, присвоив атрибуту SqlCacheDependency объекта источника данных значение CommandNotification , а атрибуту EnableCachingзначение true. При использовании этого метода код не требуется. Если результат выполнения команды для источника данных изменится, данные кэша будут недействительными.

В следующем примере настраивается элемент управления источником данных для зависимости кэша SQL:

<asp:SqlDataSource ID="ProductList" runat="server"
    ConnectionString="<%$ ConnectionStrings:Northwind %>"
    EnableCaching="true"
    SqlCacheDependency="CommandNotification"
    SelectCommand="SELECT * FROM [Products]" />

В этом случае, если запрос, указанный в SelectCommand , возвращает результат, отличный от первоначального, кэшированные результаты становятся недействительными.

Можно также указать, что все источники данных должны быть включены для зависимостей кэша SQL, задав для атрибута SqlDependency директивы @ OutputCache значение CommandNotification. Это иллюстрирует приведенный ниже пример.

<%@ OutputCache SqlDependency="CommandNotification" 
    duration="60" VaryByParam="none" %>

Примечание

Дополнительные сведения об уведомлениях о запросах в SQL Server 2005 г. см. в электронной документации по SQL Server.

Еще один метод настройки зависимости кэша SQL на основе запросов — это сделать это программным способом с помощью класса SqlCacheDependency. В следующем примере кода показано, как это делается.

string sql = "SELECT ProductName, ProductID FROM Products";
SqlConnection conn = new
SqlConnection(ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString);
SqlCommand cmd = new SqlCommand(sql, conn);
SqlCacheDependency dep = new SqlCacheDependency(cmd);
Response.AddCacheDependency(dep);

Дополнительные сведения: https://msdn.microsoft.com/library/default.asp?url=/library/enus/dnvs05/html/querynotification.asp

Подстановка после кэширования

Кэширование страницы может значительно повысить производительность веб-приложения. Однако в некоторых случаях требуется кэшировать большую часть страницы, а некоторые фрагменты на ней должны быть динамическими. Например, если вы создаете страницу новостей, которая является полностью статической для заданных периодов времени, можно настроить кэширование всей страницы. Если вы хотите включить в каждый запрос страницы изменяющийся рекламный баннер, то часть страницы, содержащая объявление, должна быть динамической. Чтобы разрешить кэшировать страницу, но динамически заменять некоторое содержимое, можно использовать ASP.NET подстановку после кэширования. При подстановке после кэширования вся страница кэшируется с определенными частями, помеченными как исключенные из кэширования. В примере рекламных баннеров элемент управления AdRotator позволяет воспользоваться преимуществами подстановки после кэширования, чтобы объявления динамически создавались для каждого пользователя и для каждого обновления страницы.

Существует три способа реализации подстановки после кэширования:

  • Декларативно, используя элемент управления Подстановка.
  • Программным способом с помощью API элемента управления подстановки.
  • Неявно с помощью элемента управления AdRotator.

Элемент управления "Подстановка"

Элемент управления ASP.NET Подстановка указывает раздел кэшированных страниц, который создается динамически, а не кэшируется. Элемент управления Подстановка размещается в расположении на странице, где будет отображаться динамическое содержимое. Во время выполнения элемент управления Подстановка вызывает метод, указанный с помощью свойства MethodName. Метод должен вернуть строку, которая затем заменяет содержимое элемента управления Подстановка. Метод должен быть статическим методом в содержавом элементе управления Page или UserControl. Использование элемента управления подстановки приводит к изменению кэшируемости на стороне клиента на кэшируемость сервера, чтобы страница не кэшировались на клиенте. Это гарантирует, что будущие запросы к странице снова вызывают метод для создания динамического содержимого.

API подстановки

Чтобы создать динамическое содержимое для кэшированных страниц программным способом, можно вызвать метод WriteSubstitution в коде страницы, передав ему имя метода в качестве параметра. Метод, обрабатывающий создание динамического содержимого, принимает один параметр HttpContext и возвращает строку. Возвращаемая строка — это содержимое, которое будет заменено в заданном расположении. Преимущество вызова метода WriteSubstitution вместо декларативного использования элемента управления Подстановка заключается в том, что можно вызвать метод любого произвольного объекта, а не статический метод объекта Page или UserControl.

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

Элемент управления AdRotator

Серверный элемент управления AdRotator реализует поддержку подстановки после кэширования внутри системы. Если вы размещаете на странице элемент управления AdRotator, он будет отображать уникальные объявления для каждого запроса, независимо от того, кэшируется ли родительская страница. В результате страница, содержащая элемент управления AdRotator, кэшируется только на стороне сервера.

Класс ControlCachePolicy

Класс ControlCachePolicy позволяет программно управлять кэшированием фрагментов с помощью пользовательских элементов управления. ASP.NET внедряет пользовательские элементы управления в экземпляр BasePartialCachingControl . Класс BasePartialCachingControl представляет пользовательский элемент управления, для которого включено кэширование выходных данных.

При доступе к свойству BasePartialCachingControl.CachePolicy элемента управления PartialCachingControl вы всегда будете получать допустимый объект ControlCachePolicy. Однако при доступе к свойству UserControl.CachePolicy элемента управления UserControl вы получите допустимый объект ControlCachePolicy только в том случае, если пользовательский элемент управления уже заключен в элемент управления BasePartialCachingControl. Если он не упакован, объект ControlCachePolicy, возвращаемый свойством , будет вызывать исключения при попытке управлять им, так как у него нет связанного элемента BasePartialCachingControl. Чтобы определить, поддерживает ли экземпляр UserControl кэширование без создания исключений, проверьте свойство SupportsCaching .

Использование класса ControlCachePolicy является одним из нескольких способов включения кэширования выходных данных. В следующем списке описаны методы, которые можно использовать для включения кэширования выходных данных.

  • Используйте директиву @ OutputCache , чтобы включить кэширование выходных данных в декларативных сценариях.
  • Используйте атрибут PartialCachingAttribute , чтобы включить кэширование для пользовательского элемента управления в файле кода программной части.
  • Используйте класс ControlCachePolicy для указания параметров кэша в программных сценариях, в которых вы работаете с экземплярами BasePartialCachingControl, которые были включены в кэш с помощью одного из предыдущих методов и динамически загружаются с помощью метода System.Web.UI.TemplateControl.LoadControl .

С экземпляром ControlCachePolicy можно успешно управлять только между этапами Инициализации и PreRender жизненного цикла элемента управления. При изменении объекта ControlCachePolicy после этапа PreRender ASP.NET вызывает исключение, так как любые изменения, внесенные после отрисовки элемента управления, не могут повлиять на параметры кэша (элемент управления кэшируется на этапе отрисовки). Наконец, экземпляр пользовательского элемента управления (и, следовательно, его объект ControlCachePolicy) доступен только для программной манипуляции, когда он фактически отрисовывается.

Изменения в конфигурации кэширования — <элемент кэширования>

В ASP.NET 2.0 в конфигурацию кэширования внесены несколько изменений. Элемент <кэширования> является новым в ASP.NET 2.0 и позволяет вносить изменения в конфигурацию кэширования в файле конфигурации. Доступны следующие атрибуты.

Элемент Описание
cache Необязательный элемент. Определяет глобальные параметры кэша приложений.
outputCache Необязательный элемент. Задает параметры кэша вывода на уровне приложения.
outputCacheSettings Необязательный элемент. Задает параметры кэша вывода, которые могут применяться к страницам в приложении.
sqlCacheDependency Необязательный элемент. Настраивает зависимости кэш-памяти SQL для приложения ASP.NET.

Элемент <cache>

В элементе cache> доступны следующие атрибуты<:

Attribute Описание
disableMemoryCollection Необязательный атрибут типа Boolean . Возвращает или задает значение, указывающее, отключен ли сбор памяти кэша, который происходит при нехватке памяти компьютера.
disableExpiration Необязательный атрибут типа Boolean . Возвращает или задает значение, указывающее, отключен ли срок действия кэша. Если этот параметр отключен, срок действия кэшированных элементов не истекает, а фоновая очистка элементов кэша с истекшим сроком действия не выполняется.
privateBytesLimit Необязательный атрибут Int64 . Возвращает или задает значение, указывающее максимальный размер частных байтов приложения до того, как кэш начнет очистку просроченных элементов и пытается освободить память. Это ограничение включает как память, используемую кэшем, так и обычные затраты на память от запущенного приложения. Нулевое значение указывает, что ASP.NET будет использовать собственную эвристические методы для определения того, когда следует начать восстановление памяти.
percentagePhysicalMemoryUsedLimit Необязательный атрибут Int32 . Возвращает или задает значение, указывающее максимальный процент физической памяти компьютера, который может быть использован приложением до того, как кэш начнет очистку просроченных элементов и пытается освободить память Это использование памяти включает как память, используемую кэшем, так и обычный объем памяти запущенного приложения. Нулевое значение указывает, что ASP.NET будет использовать собственную эвристические методы для определения того, когда следует начать восстановление памяти.
privateBytesPollTime Необязательный атрибут TimeSpan . Возвращает или задает значение, указывающее интервал времени между опросом для использования частной байтов памяти приложения.

Элемент <outputCache>

Для элемента outputCache> доступны <следующие атрибуты.

Attribute Описание
enableOutputCache Необязательный атрибут boolean . Включает или отключает кэш вывода страницы. Если этот параметр отключен, никакие страницы не кэшируются независимо от программных или декларативных параметров. Значение по умолчанию — True.
enableFragmentCache Необязательный атрибут boolean . Включает или отключает кэш фрагментов приложения. Если этот параметр отключен, страницы не кэшируются независимо от используемой директивы @ OutputCache или профиля кэширования. Включает заголовок элемента управления кэшем, указывающий, что вышестоящий прокси-серверам, а также клиентам браузера не следует пытаться кэшировать выходные данные страницы. Значение по умолчанию — false.
sendCacheControlHeader Необязательный атрибут boolean . Возвращает или задает значение, указывающее, отправляется ли по умолчанию заголовок cache-control:private модулем кэша вывода. Значение по умолчанию — false.
omitVaryStar Необязательный атрибут boolean . Включает или отключает отправку http-заголовка "Vary: </strong>" в ответе. Если по умолчанию задано значение false,для выходных кэшированных страниц отправляется заголовок "*Vary: *". При отправке заголовка Vary можно кэшировать разные версии на основе того, что указано в заголовке Vary. Например, Vary:User-Agents будет хранить разные версии страницы в зависимости от агента пользователя, выдающего запрос. Значение по умолчанию — **false.

Элемент <outputCacheSettings>

Элемент <outputCacheSettings> позволяет создавать профили кэша, как описано выше. Единственным дочерним элементом <для элемента outputCacheSettings> является <элемент outputCacheProfiles> для настройки профилей кэша.

Элемент <sqlCacheDependency>

Для элемента sqlCacheDependency> доступны <следующие атрибуты.

Attribute Описание
enabled Обязательный логический атрибут. Указывает, опрашиваются ли изменения.
pollTime Необязательный атрибут Int32 . Задает частоту, с которой SqlCacheDependency опрашивает таблицу базы данных на наличие изменений. Это значение соответствует количеству миллисекундах между последовательными опросами. Его значение не может быть меньше 500 миллисекундами. Значение по умолчанию — 1 минута.

Дополнительные сведения

Существует ряд дополнительных сведений, которые следует учитывать в отношении конфигурации кэша.

  • Если ограничение частных байтов рабочего процесса не задано, кэш будет использовать одно из следующих ограничений:

    • x86 2 ГБ: 800 МБ или 60 % физической ОЗУ, в зависимости от того, что меньше
    • x86 3 ГБ: 1800 МБ или 60 % физической ОЗУ, в зависимости от того, что меньше
    • x64: 1 терабайт или 60 % физической ОЗУ, в зависимости от того, что меньше
  • Если заданы ограничение частных байтов рабочего процесса и <кэш privateBytesLimit/> , кэш будет использовать как минимум два значения.

  • Как и в версии 1.x, мы удаляем записи кэша и вызываем сборку мусора. Собирать по двум причинам:

    • Мы очень близки к ограничению частных байтов
    • Объем доступной памяти близок или меньше 10 %
  • Вы можете эффективно отключить обрезку и кэширование для условий нехватки доступной памяти, установив для параметра <cache percentagePhysicalMemoryUseLimit/> значение 100.

  • В отличие от версии 1.x, 2.0 приостанавливает обрезку и собирает вызовы, если последняя сборка мусора. Сбор не уменьшил частные байты или размер управляемых кучи более чем на 1 % от ограничения памяти (кэша).

Задание 1. Настраиваемые зависимости кэша

  1. Создайте новый веб-сайт.

  2. Добавьте новый XML-файл с именем cache.xml и сохраните его в корне веб-приложения.

  3. Добавьте следующий код в метод Page_Load в коде программной части default.aspx:

    System.Web.Caching.CacheDependency dep = new
        System.Web.Caching.CacheDependency(Server.MapPath("cache.xml"));
    Response.AddCacheDependency(dep);
    Cache.Insert("time", DateTime.Now.ToString());
    Response.Write(Cache["time"]);
    
  4. Добавьте следующий код в начало файла default.aspx в представлении исходного кода:

    <%@ OutputCache Duration="240" VaryByParam="None" %>
    
  5. Перейдите на страницу Default.aspx. Что говорит время?

  6. Обновите окно браузера. Что говорит время?

  7. Откройте cache.xml и добавьте следующий код:

    <anElement></anElement>
    
  8. Сохраните cache.xml.

  9. Обновите свой браузер. Что говорит время?

  10. Объяснить, почему время обновлено вместо отображения ранее кэшированных значений:

Задание 2. Использование зависимостей кэша Polling-Based

В этом задании используется проект, созданный в предыдущем модуле, который позволяет редактировать данные в базе данных Northwind с помощью элементов управления GridView и DetailsView.

  1. Откройте проект в Visual Studio 2005.

  2. Запустите служебную программу aspnet_regsql в базе данных Northwind, чтобы включить базу данных и таблицу Products. Используйте следующую команду из командной строки Visual Studio:

    aspnet_regsql -S server -ed -d Northwind -E -et -t Products
    
  3. Добавьте в файл web.config следующее:

    <caching>
        <sqlCacheDependency enabled = "true" pollTime = "60000" >
            <databases>
                <add name="Northwind" connectionStringName = "Northwind" pollTime = "9000000" />
            </databases>
        </sqlCacheDependency>
    </caching>
    
  4. Добавьте новую веб-форму с именем showdata.aspx.

  5. Добавьте следующую директиву @ outputcache на страницу showdata.aspx:

    <%@ OutputCache SqlDependency="Northwind:Products" Duration="480" VaryByParam="None"%>
    
  6. Добавьте следующий код в Page_Load showdata.aspx:

    Response.Write(DateTime.Now.ToString() + "<br><br>");
    
  7. Добавьте новый элемент управления SqlDataSource в showdata.aspx и настройте его для использования подключения к базе данных Northwind. Нажмите кнопку "Далее".

  8. Установите флажки ProductName и ProductID и нажмите кнопку Далее.

  9. Нажмите кнопку «Готово».

  10. Добавьте новый элемент GridView на страницу showdata.aspx.

  11. Выберите SqlDataSource1 в раскрывающемся списке.

  12. Сохраните и просмотрите файл showdata.aspx. Запишите отображаемое время.