Пошаговое руководство. Использование нескольких объектов кэша в приложении ASP.NET

ASP.NET позволяет использовать несколько экземпляров кэша приложения веб-сайта ASP.NET, т. е. можно создавать различные экземпляры классов кэша и сохранять данные в различных экземплярах. Различные экземпляры кэша можно использовать для хранения одних и тех же или различных данных. Например, для одного экземпляра кэша можно разрешить использовать максимально возможный объем памяти, а для другой реализации — указать максимальный объем памяти, используемой кэшем.

В этом пошаговом руководстве показано, как использовать различные экземпляры объекта кэша памяти в одном приложении ASP.NET для кэширования содержимого различных текстовых файлов. Для одного текстового файла будет использоваться встроенный объект кэша памяти. Для этого кэша будет разрешено истечение срока действия каждые 10 секунд или при изменении файла (в зависимости от того, какое событие случится раньше). Для второго текстового файла будет применяться класс пользовательского кэша, наследуемый от встроенного класса памяти. На примере пользовательского класса будет показано, как хранить кэшированные данные в именованной области, которая представляет собой раздел памяти, зарезервированный для хранений одного или нескольких объектов кэша. Область кэша позволяет упорядочить объекты кэша в памяти. Встроенный объект кэша памяти не поддерживает понятие областей, но он используется в этом пошаговом руководстве для демонстрации реализации областей в классе пользовательского кэша.

ПримечаниеПримечание

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

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

  • Создание веб-сайта ASP.NET.

  • Добавление ссылки на .NET Framework.

  • Добавление класса кэша для кэширования содержимого текстового файла с помощью встроенного объекта кэша памяти.

  • Добавление реализации кэша для кэширования содержимого текстового файла с помощью объекта пользовательского кэша.

  • Добавление данных в каждый кэш.

  • Тестирование кэша.

Для выполнения этого пошагового руководства потребуется следующее.

  • Microsoft Visual Studio 2010 или Microsoft Visual Web Developer, экспресс-выпуск.

  • Два текстовый файла, каждый из которых содержит небольшой объем текста. Содержимое текстовых файлов будет отображаться на веб-странице.

Начнем с создания веб-сайта ASP.NET. Если веб-сайт был создан с помощью Microsoft Visual Studio 2010, можно использовать его и пропустить этот шаг.

Создание веб-узла ASP.NET

  1. Запустите Microsoft Visual Studio 2010 или Microsoft Visual Web Developer, экспресс-выпуск 2010.

  2. В меню Файл выберите пункт Новый веб-узел. (Если этот пункт отсутствует, выберите команду Создать, а затем — Веб-узел.) Откроется диалоговое окно Новый веб-узел.

  3. В разделе Установленные шаблоны щелкните элемент Visual Basic или C#, а затем щелкните пункт Веб-сайт ASP.NET.

  4. В поле Расположение в Интернете выберите пункт Файловая система и введите имя папки, в которой будут храниться страницы веб-сайта. Например, введите имя папки C:\Websites\MultipleCaching и нажмите кнопку ОК.

    Visual Studio создаст папку и откроет веб-сайт в представлении Исходный код. Обратите внимание, что корневой веб-сайт содержит несколько файлов и папок, включая папку Account, файл Web.config, страницы About.aspx и Default.aspx и главную страницу Site.master.

Следующий шаг — добавление текстовых файлов, которые требуется использовать, в текущий проект веб-сайта.

Добавление текстового файла в проект

  1. В окне Обозреватель решений щелкните правой кнопкой мыши имя проекта и выберите команду Добавить существующий элемент.

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

  3. Повторите эти шаги, чтобы добавить второй текстовый файл.

Чтобы использовать в приложении ASP.NET классы кэширования, определенные в пространстве имен System.Runtime.Caching, необходимо добавить в проект ссылку на это пространство имен.

Добавление ссылки на сборки кэширования

  1. В окне Обозреватель решений щелкните правой кнопкой мыши имя веб-сайта и выберите команду Добавить ссылку.

  2. Перейдите на вкладку .NET, выберите System.Runtime.Caching и нажмите кнопку ОК.

    Ссылка на эту сборку будет добавлена в проект, чтобы можно было использовать классы из пространства имен System.Runtime.Caching.

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

Добавление элементов управления на страницу

  1. С вкладки Стандартная на панели элементов перетащите два элемента управления Button на страницу Default.aspx.

  2. В окне Свойства задайте для свойства Text одного из элементов управления Button значение "Получить из встроенного кэша". Примите свойство идентификатора по умолчанию.

  3. Для свойства Text второго элемента управления Button задайте значение "Получить из пользовательского кэша". Примите свойство идентификатора по умолчанию.

  4. С вкладки Стандартная на панели элементов перетащите элемент управления Label на страницу. Примите свойство идентификатора по умолчанию.

После этого необходимо добавить код для создания экземпляра объекта встроенного кэша. Объект встроенного кэша кэширует данные в памяти. Этот код позволяет выполнить следующие действия:

  • создание экземпляра класса MemoryCache;

  • указание того, что кэш использует объект HostFileChangeMonitor для отслеживания изменений в одном из текстовых файлов, задействованных в этом пошаговом руководстве;

  • чтение текстового файла и кэширование его содержимого в виде записи кэша;

  • отображение содержимого кэшированного текстового файла.

Создание экземпляра объекта встроенного кэша памяти

  1. Дважды нажмите кнопку Получить из встроенного кэша, чтобы создать обработчик событий в файле Default.aspx.cs или Default.aspx.vb.

  2. В верхней части файла (перед объявлением класса) добавьте указанные ниже инструкции using (C#) или Imports (Visual Basic).

    using System.Runtime.Caching;
    using System.IO;
    
  3. В обработчике событий добавьте следующий код для создания экземпляра кэша.

    ObjectCache cache = MemoryCache.Default;
    

    Класс ObjectCache предоставляет кэш объекта в памяти.

    ПримечаниеПримечание

    Класс ObjectCache заменяет класс Cache, который использовался в более ранних версиях ASP.NET. В ASP.NET 4 предпочтительным способом реализации кэширования является использование класса ObjectCache.

  4. Добавьте следующий код для чтения содержимого записи кэша с именем filecontents.

    string fileContents = cache["filecontents"] as string;
    
  5. Добавьте код для выполнения следующих задач:

    • проверка наличия записи кэша с именем filecontents. Если указанная запись кэша отсутствует, необходимо выполнить чтение текстового файла и добавить его в кэш в виде записи кэша;

    • создание объекта CacheItemPolicy, указывающего, что срок действия записи кэша истекает через 10 секунд;

    • создание коллекции путей к файлам, которые требуется отслеживать, и добавление в эту коллекцию пути к текстовому файлу;

    • добавление нового объекта HostFileChangeMonitor в коллекцию и изменение мониторов записи кэша. Объект HostFileChangeMonitor отслеживает путь к текстовому файлу и при появлении изменений уведомляет кэш. В этом пошаговом руководстве монитор изменений настраивается таким образом, чтобы срок действия записи кэша автоматически истекал при изменении содержимого файла;

    • чтение содержимого текстового файла;

    • вставка содержимого файла в объект кэша в качестве экземпляра CacheItem. Указываются сведения о том, как должна быть удалена запись кэша, путем передачи объекта CacheItemPolicy в качестве параметра метода Set.

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

      if (fileContents == null)
      {
          CacheItemPolicy policy = new CacheItemPolicy();
                  policy.AbsoluteExpiration = 
                  DateTimeOffset.Now.AddSeconds(10.0);
      
                  List<string> filePaths = new List<string>();
                  string cachedFilePath = Server.MapPath("~") + "\\cachedText.txt";
                  filePaths.Add (cachedFilePath);
      
                  policy.ChangeMonitors.Add(new 
                  HostFileChangeMonitor(filePaths));
      
                  // Fetch the file contents.
                  fileContents =
                  File.ReadAllText(cachedFilePath) + "\n" +
                      " Using built-in cache " + "\n" + DateTime.Now.ToString();
                      
                  cache.Set("filecontents", fileContents, policy);
      }
      
      
  6. Добавьте следующий код, чтобы отобразить кэшированное содержимое файла в элементе управления Label.

    Label1.Text = fileContents;
    

Теперь необходимо создать класс пользовательского кэша с именем CustomCache. В этом примере пользовательский класс наследует встроенному классу MemoryCache. Методы базового класса будут переопределены для создания пользовательской реализации. С помощью API пространства имен System.Runtime.Caching можно реализовать разделы областей в классе кэша, поддерживающем области. Например, если создать пользовательский класс, наследующий классу кэша, который поддерживает области, например Windows AppFabric, пользовательский класс будет поддерживать создание объектов кэша с разделами областей. Объект встроенного кэша памяти не поддерживает понятие разделов областей, но он используется в этом пошаговом руководстве для демонстрации реализации разделов областей в классе пользовательского кэша. Перегруженные версии методов set обеспечивают различные способы добавления элементов в кэш. Элемент кэша можно добавить путем указания элемента кэша, политики окончания срока действия, именованной области пары "ключ-значение" в памяти, куда необходимо сохранить кэш, и т. д.

Создание класса пользовательского кэша

  1.  В обозревателе решений щелкните правой кнопкой мыши имя веб-узла и выберите команду Добавить новый элемент.

    Откроется диалоговое окно Новый элемент.

  2. В разделе Установленные шаблоны выберите Visual Basic или Visual C#, а затем — Класс.

  3. В текстовом поле Имя введите имя CustomCache и нажмите кнопку Добавить.

  4. В диалоговом окне, появившемся на экране, нажмите кнопку Да, чтобы поместить класс в папку App_Code.

  5. В редакторе кода замените содержимое файла класса следующим кодом.

    using System;
    using System.Web;
    using System.Runtime.Caching;
    
    namespace CustomCacheSample
    {
        public class CustomCache : MemoryCache
        {
            public CustomCache() : base("defaultCustomCache") { }
    
            public override void Set(CacheItem item, CacheItemPolicy policy)
            {
                Set(item.Key, item.Value, policy, item.RegionName);
            }
    
            public override void Set(string key, object value, DateTimeOffset absoluteExpiration, string regionName = null)
            {
                Set(key, value, new CacheItemPolicy { AbsoluteExpiration = absoluteExpiration }, regionName);
            }
    
            public override void Set(string key, object value, CacheItemPolicy policy, string regionName = null)
            {
                base.Set(CreateKeyWithRegion(key, regionName), value, policy);
            }
    
            public override CacheItem GetCacheItem(string key, string regionName = null)
            {
                CacheItem temporary = base.GetCacheItem(CreateKeyWithRegion(key, regionName));
                return new CacheItem(key, temporary.Value, regionName);
            }
    
            public override object Get(string key, string regionName = null)
            {
                return base.Get(CreateKeyWithRegion(key, regionName));
            }
    
            public override DefaultCacheCapabilities DefaultCacheCapabilities
            {
                get
                {
                    return (base.DefaultCacheCapabilities | System.Runtime.Caching.DefaultCacheCapabilities.CacheRegions);
                }
            }
    
            private string CreateKeyWithRegion(string key, string region)
            {
                return "region:" + (region == null ? "null_region" : region) + ";key=" + key;
            }
        }
    }
    
    
  6. Сохраните файл.

Теперь необходимо создать экземпляр класса CustomCache и создать объект пользовательского кэша памяти, который добавляет запись кэша в определенную область. Этот код позволяет выполнить следующие действия:

  • создание экземпляра класса пользовательского кэша;

  • указание именованной области (области кэша, в которую может быть добавлена запись кэша). Путь к текстовому файлу не отслеживается на предмет изменений. Это означает, что срок действия записи кэша не истечет при изменении файла;

  • чтение текстового файла и кэширование его содержимого в виде записи кэша;

  • отображение содержимого кэшированного текстового файла.

Создание экземпляра объекта пользовательского кэша и добавление записи кэша

  1. Перейдите к файлу Default.aspx или откройте его.

  2. Дважды нажмите кнопку Получить из пользовательского кэша, чтобы создать обработчик событий в файле Default.aspx.cs или Default.aspx.vb.

  3. В верхней части файла (перед объявлением класса) добавьте указанные ниже инструкции Imports (Visual Basic) или using (C#), чтобы добавить пространство имен, содержащее класс.

    using CustomCacheSample;
    
  4. Внутри объявления класса (разделяемого класса _Default), но вне существующего обработчика событий добавьте следующий код для создания экземпляра пользовательского кэша. Необходимо создать и сохранить ссылку на пользовательский кэш, чтобы не допустить его выхода за пределы области действия.

    private static ObjectCache customCache = 
        new CustomCache();
    private ObjectCache RegionCache { get { return customCache; } }
    
  5. Внутри обработчика событий Click объекта Button2 добавьте следующий код, считывающий содержимое записи кэша с именем CustomFilecontents из области RegionCache.

    string CustomFileContents = RegionCache.Get("filecontents", "Region_A") as string;
    
    
  6. Добавьте код для выполнения следующих задач:

    • проверка наличия записи кэша с именем CustomeFilecontents. Если указанная запись кэша отсутствует, необходимо выполнить чтение текстового файла и добавить его в кэш в виде записи кэша;

    • чтение текстового файла;

    • вставка содержимого файла в объект пользовательского кэша в качестве записи кэша. При этом указывается именованная область, куда следует добавить запись, путем передачи имени области в качестве параметра метода Set. Также указывается, что срок действия кэша не должен истекать по абсолютному времени, путем передачи поля InfiniteAbsoluteExpiration в качестве параметра метода Set. Вместо этого срок действия элементов истекает только при нехватке памяти.

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

      ПримечаниеПримечание

      Строка "Using custom cache"добавлена в текстовый файл, чтобы было проще обнаружить кэшированные данные при тестировании страницы, как будет описано ниже.

      if (CustomFileContents == null)
      {
          //Fetch the file contents
          string cachedFilePath = Server.MapPath("~") + "\\cachedText.txt";
          CustomFileContents = File.ReadAllText(cachedFilePath) + 
             " Using custom cache " + "\n" + DateTime.Now.ToString();
                   
          // For this cache region, do not bind a file-change monitor.
          // The cache will not expire based on absolute time.
          RegionCache.Set("filecontents", CustomFileContents, ObjectCache.InfiniteAbsoluteExpiration, "Region_A");
      
      }
      
  7. Добавьте следующий код, чтобы отобразить кэшированное содержимое файла в элементе управления Label.

    Label1.Text = CustomFileContents
    
    Label1.Text = CustomFileContents;
    

Теперь можно протестировать кэширование.

Тестирование кэширования

  1. Нажмите сочетание клавиш CTRL+F5, чтобы запустить приложение.

  2. Нажмите кнопку Получить из встроенного кэша.

    В метке отображается кэшированное содержимое текстового файла. Обратите внимание на инструкцию "Using built-in cache" и отметку времени в конце файла.

  3. Снова нажмите кнопку Получить из встроенного кэша.

    Отметка времени не изменилась. Это означает, что отображается кэшированное содержимое.

  4. Подождите 10 секунд или более и снова нажмите кнопку Получить из встроенного кэша.

    Теперь отображается новая отметка времени. Это означает, что политика допускает истечение срока действия кэша через 10 секунд и что отображается новое кэшированное содержимое.

  5. Нажмите кнопку Получить из пользовательского кэша.

    В метке отображается кэшированное содержимое текстового файла. Обратите внимание на фразу "Using custom cache" и отметку времени в конце файла.

  6. Снова нажмите кнопку Получить из пользовательского кэша. Отметка времени не изменилась. Это означает, что отображается кэшированное содержимое.

  7. Подождите 10 секунд или более и снова нажмите кнопку Получить из пользовательского кэша. Отметка времени все еще не изменилась. Это указывает, что срок действия кэша не истекает в соответствии с политикой. Однако при нехватке памяти на сервере срок действия кэша истекает автоматически.

Показ: