Возможности расширения приложений ASP.NET
Модули HTTP
Модель разработки ASP.NET позволяет разработчику расширять структуру приложения за счет использования различных механизмов расширения. Одним из наиболее важных механизмов расширения являются HTTP-модули.
HTTP-модули – это объекты, которые загружаются в процессе работы приложения и позволяют запускать программный код на различных стадиях обработки запроса HTTP. При инициализации HTTP-модуля производится подписка на необходимые события модели событий ASP.NET, которые выполняются на соответствующих этапах жизненного цикла страницы. Если рассмотреть структуру среды выполнения с точки зрения загрузки программных компонентов расширения, то можно увидеть следующую картину.
В момент поступления запроса поочередно инициализируются все HTTP-модули, определенные в конфигурации приложения, в которых производится подписка на нужные события. После этого создается HTTP-обработчик (работа которого будет рассмотрена далее) и управление передается ему.
HTTP-модули могут использоваться как в приложениях ASP.NET Web Forms, так и в приложениях ASP.NET MVC Framework. Они встраиваются в цепочку обработки запроса веб-сервера Internet Information Services (IIS), в рамках которого работают все приложения ASP.NET.
Каждый HTTP-модуль является объектом .NET Framework, который реализует интерфейс IHttpModule. Этот интерфейс содержит два простых метода – Init и Dispose.
Метод Init запускается в момент инициализации HTTP-модуля. В рамках этого метода обычно происходит подписка на нужные события. Важно, что HTTP-модули загружаются один раз, при запуске веб-приложения. Все запросы к приложению обрабатывает один и тот же HTTP-модуль. Метод Init не будет вызван при обращении к странице, если запрос осуществляется к уже запущенному приложению.
Метод Dispose используется для освобождения ресурсов и вызывается в случае завершения всего приложения. Зачастую этот метод не содержит кода, и необходим только в том случае, когда необходимо явно освободить какие-либо ресурсы, которые были созданы модулем в момент инициализации.
Таким образом, жизненный цикл HTTP-модуля можно представить следующим образом.
На приведенной схеме также хорошо видно, что модуль создается, загружается в память и инициализируется один раз, при старте приложения. Все последующие запросы обрабатываются этим же объектом.
Для того, чтобы определить логику HTTP-модуля, необходимо использовать события, которые доступны в рамках модели событий ASP.NET. Для того, чтобы подписаться на нужные события используется объект приложения HttpApplication, который передается в параметрах метода Init. Аналогично файлу приложения global.asax, в рамках HTTP-модуля можно подписаться на любые события цикла обработки запроса и приложения. Например, чтобы подписаться на событие BeginRequest можно использовать следующий код.
В данном случае мы создаем метод-обработчик события, и, используя объект приложения HttpApplication, подписываемся на событие. Аналогичным образом можно подписаться одновременно на несколько событий.
После создания HTTP-модуля необходимо уведомить среду исполнения о том, что необходимо использовать этот модуль при работе приложения. Для этого необходимо добавить информацию о HTTP-модуле в файл конфигурации приложения. Для этого используется конфигурационная секция "httpModules", которая расположена в секции "system.web". Для добавления нового модуля используется узел "add", который должен содержать атрибуты "name" и "type". Атрибут "name" содержит имя модуля, которое будет использоваться при мониторинге приложения. Атрибут "type" содержит полное имя класса модуля (включая пространства имен), а также имя сборки, если этот класс размещен во внешней сборке. Например, добавление модуля в приложение может выглядеть следующим образом.
После такого определения модуль будет загружен и проинициализирован при запуске приложения.
При исполнении приложения можно получить список всех используемых HTTP-модулей. Для этого можно использовать объект приложения HttpApplication, который содержит коллекцию Modules. Просмотреть информацию обо всех HTTP-модулях можно следующим образом.
HTTP-модули могут использоваться для реализации совершенно различных сценариев. Так, например, в существующей инфраструктуре ASP.NET содержится большой набор HTTP-модулей, которые реализуют различную логику. Среди таких HTTP-модулей присутствуют модули аутентификации (модуль безопасности), поддержки сессий, кэширования HTML-кода и др.
Удобство применения HTTP-модулей состоит в том, что однажды разработанный HTTP-модуль можно использовать во вновь создаваемом приложении. Для этого необходимо скопировать в проект сборку, содержащую модуль и разместить в конфигурационном файле информацию о HTTP-модуле. Кроме того, используя конфигурационный файл HTTP-модули можно очень удобно включать и отключать при отладке приложения. По этой причине HTTP-модули нашли широкое применение среди разработчиков приложений на базе ASP.NET.
Краткие итоги
HTTP-модули являются одним из наиболее важных механизмов расширения. HTTP-модули представляют собой классы, реализующие интерфейс IHttpModule. В рамках этого интерфейса доступно два метода – Init и Dispose. В методе Init производится подписка на события, содержащиеся в модели событий ASP.NET. Каждый HTTP-модуль загружается при запуске приложения и обрабатывает все запросы до тех пор, пока приложение не будет выгружено. Для подключения HTTP-модуля к существующей среде обработки запросов используется конфигурационный файл.