Спонсор: Microsoft
Опубликован: 24.05.2010 | Уровень: специалист | Доступ: платный
Лекция 10:

Технология ASP.Net: развертывание и кэширование веб – приложений

< Лекция 9 || Лекция 10: 12 || Лекция 11 >

Использование средства "Копировать веб-узел"

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

Кэширование веб-приложений

Использование кэширования для повышения производительности

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

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

К счастью, в .NET Framework 2.0 включен объект Cache, обеспечивающий повышение производительности без написания кода, решающего проблемы с кэшированием.

В ASP.NET поддерживается два типа кэширования:

  1. Кэширование приложений

    Реализовано в виде набора, способного хранить в памяти любые объекты, автоматически удаляя объекты в зависимости от ограничений по доступной памяти, времени хранения и других условий.

  2. Кэширование сгенерированных страниц

ASP.NET хранит копию обработанных страниц для уменьшения времени, необходимого для обслуживания последующих их запросов.

На этом занятии рассматривается кэширование обоих типов.

Изучив материал этого занятия, вы сможете:

  • использовать кэширование приложений для повышения производительности обработки запросов к базе данных и других операций по извлечению данных;
  • использовать кэширование сгенерированных страниц для повышения производительности обработки страниц.

Продолжительность занятия — около 40 минут.

Кэширование приложений

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

Перед применением кэшированного элемента набора Cache необходимо убедиться, что оно не равно null. Если запрашиваемое значение равно null, оно либо не было кэшировано, либо срок его действия истек. В этом случае объект придется получить из первоначального источника, а не из Cache.

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

Методы Add и Insert

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

Метод Cache.Insert принимает следующие параметры (они могут различаться в зависимости от используемой перегруженной версии):

  • Ключ.

    Строка (String), которая будет использована для доступа к кэшированному объекту из набора Cache.

  • Объект ( Object ), который будет кэширован. Объект, кэшируемый для дальнейшего использования.
  • Зависимость (необязательный параметр).

    Объект CacheDependency, идентифицирующий файл или ключ кэша, вызывает удаление этого объекта из кэша при изменении исходного файла или ключа. При кэшировании файла следует настроить его зависимость так, чтобы он удалялся из кэша при изменении исходного файла во избежание хранения в кэше устаревших данных. Может иметь значение null.

  • Абсолютный срок действия (необязательный параметр).

    Время (в виде объекта DateTime ), по наступлении которого объект будет удален из кэша независимо от того, обращались ли к нему в последнее время. Если функция не нужна, установите значение System.Web.Caching.Cache.NoAbsoluteExpiration.

  • Промежуток времени (необязательный параметр).

    Промежуток времени (в виде объекта TimeSpan ), по прошествии которого объект удаляется из кэша, если не используется. В случае, когда эта функция не нужна, установите значение System.Web.Caching.Cache.NoSlidingExpiration.

  • Приоритет (необязательный параметр).

    Значение перечислимого Cache Item Priority, определяющее объекты, удаляемые в первую очередь при нехватке памяти. Сначала удаляются объекты с более низким приоритетом. Если эта функция не нужна, установите значение System.Web.Caching.Cache-ItemPriority. Default,

  • Метод обратного вызова (необязательный параметр).

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

Следующий фрагмент кода демонстрирует создание зависимости кэша для файла. Если файл изменится

Cache.Insert("FileCache","CacheContents", new System.Web.Caching.CacheDependency( Server.MapPath("SourceFile.xml")));

Для одного объекта можно создать несколько зависимостей. Следующий пример демонстрирует применение объекта AggregateCacheDependency для добавления в кэш элемента, зависимого от элемента с именем Cachelteml и от файла с именем SourceFile.xml.

System.Web.Caching.CacheDependency dep1 =
  new System.Web.Caching.CacheDependency(Server.MapPath("SourceFile.xml")); 
string[] keyDependencies2 = { "Cachelteml" }; 
System.Web.Caching.CacheDependency dep2 =
  new System.Web.Caching.CacheDependency(null, keyDependencies2); 
System.Web.Caching.AggregateCacheDependency aggDep =
  new System.Web.Caching.AggregateCacheDependency(); 
aggDep.Add(depl); 
aggDep.Add(dep2); 
Cache.Insert("FileCache", "CacheContents", aggDep);

Если кэшированный объект должен использоваться в течение определенного времени, после которого срок его действия истекает, передайте методу Cache.Insert срок действия. Объект DateTime.Now поддерживает методы для добавления к текущему времени заданного числа минут, как показано в следующем примере:

Cache.Insert("FileCache", "CacheContents", null, DateTime.Now.AddMinutes(IOd), TimeSpan.Zero);

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

Cache.Insert("CacheItem7", "Cached Item 7",
null, System.Web.Caching.Cache.NoAbsoluteExpiration, new TimeSpan(0, 10, 0));

Метод Cache.Add работает аналогично методу Cache.Insert, но возвращает заданное значение. Это облегчает использование метода Cache.Add при добавлении элемента в кэш, а также определяет еще одну переменную в той же строке кода.

Кэширование сгенерированных страниц

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

Кэширование на стороне клиента требует, чтобы все пользователи получали динамически генерируемую версию страницы. Если один пользователь посетит веб-сайт 100 раз, веб-серверу потребуется сгенерировать эту страницу только один раз. Если же 100 пользователей посетят веб-сайт по одному разу, веб-серверу понадобится сгенерировать страницу все 100 раз.

Для повышения производительности в ASP.NET включена поддержка кэширования сгенерированных страниц. Оно позволяет хранять в памяти копии обработанных веб-страниц ASP.NET. При следующем обращении пользователя (того же или другого) ASP.NET вернет страницу почти мгновенно. Если обработка страницы занимает много времени (например, когда страница выполняет несколько запросов), этот прием значительно повышает производительность.

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

Задание возможности кэширования страницы

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

Когда веб-сервер посылает ответ на запрос запрашивающему веб-обозревателю, сервер включает в HTTP-заголовок ответа поле Cache-Control, определяющее устройства, в которых страница может кэшироваться. В зависимости от потребностей приложения можно определить, какие устройства должны, а какие не должны кэшировать отдельные страницы ASP.NET. Например, можно сделать так, чтобы параметры кэширования страницы входа пользователя в систему отличались от параметров кэширования страницы, на которой отображается содержимое каталога продукции. В случае страницы входа в систему в целях обеспечения безопасности будет, вероятно, разумным выполнять кэширование только на сервере, в то время как страницу каталога можно, видимо, кэшировать на любом способном к кэшированию устройстве.

Для страниц ASP.NET можно задать параметры кэширования с помощью значений в перечислении HttpCacheability. Значения перечисления указаны ниже. Первые три сопоставляются непосредственно с параметром HTTP-заголовка Cache-Control, последние три — это особые значения.

  1. NoCache: указывает на то, что устройство, посылающее запрос, должно получать ответ от веб-сервера каждый раз.
  2. Public: позволяет кэшировать ответ по клиентам и в общих кэшах (прокси-серверы).
  3. Private: задает условие, при котором ответ может быть кэширован только на клиенте, и не может быть кэширован в общих кэшах (прокси-серверы).
  4. Server: задает кэширование ответа только на исходном сервере.
  5. ServerAndNoCache: применяет как значение Server, так и NoCache для указания того, что содержимое кэшируется на сервере, и всем остальным участникам явно запрещается кэшировать ответ.
  6. ServerAndPrivate: указывает на то, что ответ должен кэшироваться только на исходном сервере и запрашивающем клиенте; кэширование ответа прокси-серверами не разрешается.
< Лекция 9 || Лекция 10: 12 || Лекция 11 >
Екатерина Соколова
Екатерина Соколова
Россия, Ухта
Никита Гекторов
Никита Гекторов
Украина, Донецк