Пошаговое руководство. Кэширование данных приложения в ASP.NET
Кэширование позволяет хранить данные в памяти для быстрого доступа. Приложения могут обращаться к кэшу, а не извлекать данные из исходного источника при каждом доступе к данным. В результате исключаются повторные запросы данных, повышается производительность и улучшается масштабируемость. Кроме того, кэширование обеспечивает доступность данных при временной недоступности источника данных.
В платформе .NET Framework предоставляются классы, позволяющие использовать средства кэширования в приложениях ASP.NET. Эти классы определяются в пространстве имен System.Runtime.Caching.
Примечание
Пространство имен System.Runtime.Caching — это новое пространство имен в платформе .NET Framework 4.Это пространство имен обеспечивает доступность кэширования для всех приложений платформы .NET Framework.
В данном пошаговом руководстве показано использование функции кэширования, которая доступна в платформе .NET Framework в качестве компонента приложения ASP.NET. В этом руководстве кэшируется содержимое текстового файла.
В данном пошаговом руководстве представлены следующие задачи:
Создание веб-сайта ASP.NET.
Добавление ссылки на платформу .NET Framework 4.
Добавление записи кэша, в которой кэшируется содержимое файла.
Реализация политики вытеснения записи кэша.
Отслеживание пути к кэшированному файлу и уведомление кэша об изменениях отслеживаемых элементов.
Обязательные компоненты
Для выполнения этого пошагового руководства потребуется следующее.
Microsoft Visual Studio 2010.
Текстовый файл с небольшим объемом текста. Содержимое этого текстового файла будет отображено на веб-странице.
Создание веб-узла ASP.NET
Начнем с создания веб-сайта ASP.NET.
Предупреждение
В данном пошаговом руководстве используется проект веб-сайта.Вместо этого можно использовать проект веб-приложения.Сведения о различиях между этими типами веб-проектов см. в разделе Сравнение проектов веб-приложений с проектами веб-сайтов.
Создание веб-узла ASP.NET
Запустите Visual Studio 2010.
В меню Файл выберите пункт Новый веб-узел. (Если этот пункт отсутствует, выберите команду Создать, а затем — Веб-узел.)
Откроется диалоговое окно Новый веб-узел.
В разделе Установленные шаблоны щелкните элемент Visual Basic или C#, а затем щелкните пункт Веб-сайт ASP.NET.
В поле Расположение в Интернете выберите пункт Файловая система и введите имя папки, в которой будут храниться страницы веб-сайта. Например, введите имя папки C:\Websites\AppCaching и нажмите кнопку ОК.
Visual Studio создаст веб-проект, включающий стандартные функциональные возможности для макета (главную страницу, страницы содержимого Default.aspx и About.aspx и каскадную таблицу стилей), технологии Ajax (файлы клиентских скриптов) и проверки подлинности (членство в ASP.NET). По умолчанию при создании новой страницы Visual Web Developer отображает страницу в представлении Исходный код, где можно видеть HTML-элементы страницы.
Следующий шаг — добавление текстового файла, который требуется использовать, в текущий проект веб-сайта.
Добавление текстового файла в проект
В окне Обозреватель решений щелкните правой кнопкой мыши имя проекта и выберите команду Добавить существующий элемент.
В диалоговом окне Добавить существующий элемент выберите текстовый файл, который требуется использовать для данного пошагового руководства, и нажмите кнопку Добавить.
Добавление ссылки на сборку кэширования
Чтобы использовать пространство имен System.Runtime.Caching в приложении ASP.NET, необходимо добавить ссылку на это пространство имен.
Добавление ссылки на веб-сайт
В окне Обозреватель решений щелкните правой кнопкой мыши имя веб-сайта и выберите команду Добавить ссылку.
Перейдите на вкладку .NET, выберите System.Runtime.Caching и нажмите кнопку ОК.
Добавление элементов управления на страницу ASP.NET
Следующий шаг — добавление кнопки и элемента управления Label на страницу. Будет создан обработчик событий для события Click кнопки. Позже будет добавлен код, обеспечивающий при нажатии кнопки отображение кэшированного текста в элементе управления Label.
Добавление элементов управления на страницу
Откройте страницу Default.aspx или перейдите к ней.
С вкладки Стандартная на панели элементов перетащите элемент управления Button на страницу Default.aspx.
В окне Свойства задайте для свойства Text элемента управления Button значение Get From Cache. Примите свойство идентификатора по умолчанию.
С вкладки Стандартная на панели элементов перетащите элемент управления Label на страницу. Примите свойство идентификатора по умолчанию.
Создание кэша и кэширование записи
Теперь будет добавлен код для выполнения следующих задач.
Создание экземпляра класса кэша (будет создан экземпляр объекта кэша).
Указание того, что для отслеживания изменений в текстовом файле кэш использует объект HostFileChangeMonitor.
Чтение текстового файла и кэширование его содержимого в виде записи кэша.
Отображение содержимого кэшированного текстового файла.
Создание объекта кэша
Дважды нажмите кнопку, чтобы создать обработчик событий в файле Default.aspx.cs или Default.aspx.vb.
В верхней части файла (перед объявлением класса) добавьте указанные ниже операторы Imports (Visual Basic) или using (C#).
[Visual Basic]
Imports System.Runtime.Caching Imports System.IO
[C#]
using System.Runtime.Caching; using System.IO;
В обработчике событий добавьте следующий код для создания экземпляра кэша.
[Visual Basic]
Dim cache As ObjectCache = MemoryCache.Default
[C#]
ObjectCache cache = MemoryCache.Default;
ObjectCache — это базовый класс, предоставляющий методы для реализации объекта кэша в памяти.
Примечание
В ASP.NET 4 кэширование реализуется с помощью класса ObjectCache.
Добавьте следующий код для чтения содержимого записи кэша с именем filecontents
[Visual Basic]
Dim fileContents As String = TryCast(cache("filecontents"), String)
[C#]
string fileContents = cache["filecontents"] as string;
Добавьте следующий код для проверки наличия записи кэша с именем filecontents
[Visual Basic]
If fileContents Is Nothing Then End If
[C#]
if (fileContents == null) { }
Если указанная запись кэша отсутствует, необходимо выполнить чтение текстового файла и добавить его в кэш в виде записи кэша.
В блоке if/then добавьте следующий код, чтобы создать новый объект CacheItemPolicy, указывающий, что срок действия кэша истекает через 10 секунд.
[Visual Basic]
Dim policy As New CacheItemPolicy() policy.AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(10.0)
[C#]
CacheItemPolicy policy = new CacheItemPolicy(); policy.AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(10.0);
Если сведения о вытеснении или сроке действия не предоставляются, по умолчанию используется значение InfiniteAbsoluteExpiration, которое указывает, что срок действия элементов в кэше истекает не на основе абсолютного времени, а только при нехватке памяти. Рекомендуется всегда явно предоставлять абсолютный или скользящий срок действия. В данном пошаговом руководстве используется абсолютный срок действия 10 секунд.
Внутри блока if/then после кода, добавленного на предыдущем шаге, добавьте следующий код, чтобы создать коллекцию для подлежащих отслеживанию путей к файлам и добавить в нее путь к текстовому файлу.
[Visual Basic]
Dim filePaths As New List(Of String)() Dim cachedFilePath As String = Server.MapPath("~") & _ "\cacheText.txt" filePaths.Add(cachedFilePath)
[C#]
List<string> filePaths = new List<string>(); string cachedFilePath = Server.MapPath("~") + "\\cacheText.txt"; filePaths.Add(cachedFilePath);
Метод HttpServerUtilityMapPath() возвращает путь к корню текущего веб-сайта.
После кода, добавленного на предыдущем шаге, добавьте следующий код, чтобы добавить новый объект HostFileChangeMonitor в коллекцию мониторов изменений для записи кэша.
[Visual Basic]
policy.ChangeMonitors.Add(New HostFileChangeMonitor(filePaths))
[C#]
policy.ChangeMonitors.Add(new HostFileChangeMonitor(filePaths));
Объект HostFileChangeMonitor отслеживает путь к текстовому файлу и при появлении изменений уведомляет кэш. В этом примере срок действия записи кэша автоматически истечет при изменении содержимого файла.
После кода, добавленного на предыдущем шаге, добавьте следующий код для чтения содержимого текстового файла.
fileContents = File.ReadAllText(cachedFilePath) & vbCrLf & DateTime.Now.ToString()
fileContents = File.ReadAllText(cachedFilePath) + "\n" + DateTime.Now;
Отметка даты и времени добавляется для определения времени окончания срока действия записи кэша.
После кода, добавленного на предыдущем шаге, добавьте следующий код, чтобы вставить содержимое файла в объект кэша в качестве экземпляра CacheItem.
[Visual Basic]
cache.Set("filecontents", fileContents, policy)
[C#]
cache.Set("filecontents", fileContents, policy);
Указываются сведения о том, как должна быть удалена запись кэша путем передачи объекта CacheItemPolicy в качестве метода с параметром Set.
Добавьте после блока if/then следующий код, чтобы отобразить кэшированное содержимое файла в элементе управления Label.
[Visual Basic]
Label1.Text = fileContents
[C#]
Label1.Text = fileContents;
Проверка кэширования на веб-сайте ASP.NET
Теперь приложение можно протестировать.
Проверка кэширования на веб-сайте ASP.NET
Нажмите CTRL+F5, чтобы запустить приложение.
Нажмите кнопку Получить из кэша.
В метке отображается кэшированное содержимое текстового файла. Обратите внимание на отметку времени в конце файла.
Снова нажмите кнопку Получить из кэша.
Отметка времени не изменилась. Это означает, что отображается кэшированное содержимое.
Подождите 10 секунд или более и снова нажмите кнопку Получить из кэша.
Теперь отображается новая отметка времени. Это означает, что политика допускает истечение срока действия кэша через 10 секунд и что отображается новое кэшированное содержимое.
В текстовом редакторе откройте текстовый файл, добавленный в проект веб-сайта. Пока не вносите никаких изменений.
Снова нажмите кнопку Получить из кэша.
Снова обратите внимание на отметку времени.
Внесите изменение в текстовый файл и сохраните файл.
Снова нажмите кнопку Получить из кэша.
Теперь отметка времени сразу же изменяется. Это означает, что после внесения изменения монитор изменений файла узла сразу же удалил элемент кэша.
Примечание
Время вытеснения можно увеличить до 20 секунд или более, чтобы было больше времени для внесения изменений в файл.
Пример кода
После выполнения инструкций данного пошагового руководства код для созданного веб-сайта будет иметь вид, подобный представленному в следующем примере.
Imports System.Runtime.Caching
Imports System.IO
Partial Class _Default
Inherits System.Web.UI.Page
Protected Sub Button1_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Dim cache As ObjectCache = MemoryCache.Default
Dim fileContents As String = TryCast(cache("filecontents"), _
String)
If fileContents Is Nothing Then
Dim policy As New CacheItemPolicy()
policy.AbsoluteExpiration = _
DateTimeOffset.Now.AddSeconds(10.0)
Dim filePaths As New List(Of String)()
Dim cachedFilePath As String = Server.MapPath("~") & _
"\cacheText.txt"
filePaths.Add(cachedFilePath)
policy.ChangeMonitors.Add(New _
HostFileChangeMonitor(filePaths))
' Fetch the file contents.
fileContents = File.ReadAllText(cachedFilePath) & _
vbCrLf & DateTime.Now.ToString()
cache.Set("filecontents", fileContents, policy)
End If
Label1.Text = fileContents
End Sub
End Class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Runtime.Caching;
using System.IO;
public partial class _Default : System.Web.UI.Page
{
protected void Button1_Click1(object sender, EventArgs e)
{
ObjectCache cache = MemoryCache.Default;
string fileContents = cache["filecontents"] as string;
if (fileContents == null)
{
CacheItemPolicy policy = new CacheItemPolicy();
policy.AbsoluteExpiration =
DateTimeOffset.Now.AddSeconds(10.0);
List<string> filePaths = new List<string>();
string cachedFilePath = Server.MapPath("~") +
"\\cacheText.txt";
filePaths.Add(cachedFilePath);
policy.ChangeMonitors.Add(new
HostFileChangeMonitor(filePaths));
// Fetch the file contents.
fileContents = File.ReadAllText(cachedFilePath) + "\n"
+ DateTime.Now.ToString();
cache.Set("filecontents", fileContents, policy);
}
Label1.Text = fileContents;
}
}
Следующие действия
В ASP.NET можно использовать несколько реализаций кэша для кэширования данных. Дополнительные сведения см. в статье Caching Application Data by Using Multiple Cache Objects in an ASP.NET Application.