Проектирование и разработка веб-приложений на основе технологий Microsoft

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

Показывать лекцию целиком

В зависимости от ситуации развертывание веб-приложений .NET Framework может быть очень простым. Поскольку такие приложения обычно состоят только из файлов, их можно развертывать на веб-серверах, просто копируя файлы. А что, если нужно обновить приложение? В большинстве случаев достаточно просто записать новые файлы поверх старых. Если веб-приложение работает на единственном сервере, не требуется запускать программу установки, изменять реестр и добавлять элементы в меню Пуск.

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

Однако иногда требуется строгий контроль над процессом развертывания приложения. Так, могут понадобиться настройка веб-сервера, копирование файлов, добавление записей в реестр, загрузка и установка необходимых компонентов. Также бывает необходимо создать пакет для Установщика Windows ( .msi -файла), чтобы приложение можно было развертывать через Active Directory и Microsoft Systems Management Server (SMS). Наконец, при создании веб-приложения, которое пользователи могут загружать из Интернета и устанавливать на своих компьютерах, MSI-файл поможет выполнять установку автоматически, даже если пользователь не умеет настраивать веб-серверы.

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

Создание проекта веб-установки

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

  • Откройте веб-сайт в Visual Studio.
  • В Visual Studio выберите команду меню
  • В списке Project Types раскройте узел Другие типы проектов и выберите Установка и развертывание. В секции Шаблоны выберите Проект веб - установки. В поле Имя введите имя проекта и щелкните ОК.
  • Когда создадите проект веб-установки, можете добавить в него дополнительные папки, файлы и сборки, которые не входят в стандартные выходные данные проекта. Это нужно, например, для добавления отдельных папок с изображениями, еще не включенных в проект веб-сайта.

    Проект веб-установки не компилируется автоматически при компиляции веб-приложения. Вместо этого в окне Solution Explorer нужно выбрать команду меню Web Setup Project\Build. Путь к созданному .msi -файлу находится среди выходных данных компиляции в Visual Studio.

    Средство "Опубликовать веб-узел"

    Средство "Опубликовать веб-узел" выполняет предварительную компиляцию содержимого веб-узла, включая веб-страницы (ASPX-файлы) и код. Затем выходные данные копируются в каталог или в заданное расположение на сервере. Публикацию веб-узла можно осуществить как часть процесса предварительной компиляции. Кроме того, предварительную компиляцию можно выполнить локально и затем самостоятельно скопировать файлы на целевой сервер. Средство "Опубликовать веб-узел" компилирует веб-узел и отделяет исходный код от файлов, оставляя только файлы-заглушки для страниц и скомпилированные сборки. Когда пользователи запрашивают страницу, ASP.NET выполняет запрос из предварительно скомпилированных сборок.

    Проекты веб-приложений

    В дополнении к использованию средства "Опубликовать веб-узел" можно создавать веб-узлы с помощью проекта веб-приложения. В проекте веб-приложения все файлы классов компилируются в одну сборку. Данная сборка будет развернута вместе с ASPX-файлами, ASCX-файлами и прочими файлами статического содержимого. (Данная модель проекта веб-приложения имеет сходство с моделью, используемой в Visual Studio .NET 2003.) В данной модели ASPX-файлы не будут скомпилированы до тех пор, пока они не будут запущены в веб-обозревателе.

    Выбор средства развертывания

    Выбор между средством "Копировать веб-узел" и средством "Опубликовать веб-узел" зависит от того, как планируется использовать и обслуживать веб-узел.

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

    Преимущества использования средства "Копировать веб-узел":

  • Развертывание — это копирование файлов с веб-узла на целевой компьютер.
  • Развертывание на целевом компьютере можно выполнить с помощью любого протокола соединения, поддерживаемого Visual Studio. Копирование можно выполнить в общую папку, расположенную на другом компьютере сети. Для копирования файлов на сервер можно использовать протокол FTP или HTTP, которые поддерживаются серверными расширениями FrontPage.
  • Возможность выполнять изменения или исправлять ошибки напрямую на сервере.
  • При работе с проектом, файлы которого хранятся на центральном сервере, можно использовать функцию синхронизации для обеспечения синхронизации версий локальных и удаленных файлов.
  • Недостатки использования средства "Копировать веб-узел":

  • Веб-узел копируется в исходном виде. Поэтому, если файлы содержат ошибку компиляции, ошибка не будет обнаружена до тех пор, пока кто-нибудь (возможно пользователь) не запустит страницу, которая вызывает ошибку.
  • Выбор средства "Опубликовать веб-узел"

    Преимущества использования средства "Опубликовать веб-узел":

  • Процесс предварительной компиляции помогает обнаружить ошибки времени компиляции и потенциальные ошибки в файле Web.config, а также в других файлах, не содержащих программный код.
  • Исходный код удаляется из веб-узла и, если необходимо, удаляется разметка в веб-файлах ASP.NET и пользовательские элементы управления. Это позволяет защитить интеллектуальную собственность и усложняет доступ других пользователей к исходному коду узла.
  • Так как страницы веб-узла уже скомпилированы, при первом запросе динамическая компиляция не требуется. Это позволяет сократить время отклика при запросе страницы. (Когда страницы динамически скомпилированы, выходные данные кэшируются для последующих запросов.)
  • Недостатки использования средства "Опубликовать веб-узел":

  • В зависимости от заданных параметров публикации можно выполнить повторную компиляцию веб-узла при его изменении. Поэтому нецелесообразно использовать средство "Опубликовать веб-узел" на этапе разработки веб-узла и при частом изменении страниц.
  • Средство "Опубликовать веб-узел" не позволяет развернуть скомпилированный веб-узел на удаленном сервере. Данное средство выполняет копирование только на локальный компьютер или другой компьютер в локальной сети.
  • Использование средства "Копировать веб-узел"

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

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

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

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

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

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

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

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

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

  • Кэширование сгенерированных страниц
  • 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, последние три — это особые значения.

  • NoCache: указывает на то, что устройство, посылающее запрос, должно получать ответ от веб-сервера каждый раз.
  • Public: позволяет кэшировать ответ по клиентам и в общих кэшах (прокси-серверы).
  • Private: задает условие, при котором ответ может быть кэширован только на клиенте, и не может быть кэширован в общих кэшах (прокси-серверы).
  • Server: задает кэширование ответа только на исходном сервере.
  • ServerAndNoCache: применяет как значение Server, так и NoCache для указания того, что содержимое кэшируется на сервере, и всем остальным участникам явно запрещается кэшировать ответ.
  • ServerAndPrivate: указывает на то, что ответ должен кэшироваться только на исходном сервере и запрашивающем клиенте; кэширование ответа прокси-серверами не разрешается.
  • Вернуться к учебному плану