Пошаговое руководство. Создание и регистрация пользовательского HTTP-модуля
Обновлен: Ноябрь 2007
Данное пошаговое руководство показывает базовые функции пользовательских HTTP-модулей. HTTP-модуль вызывается при каждом запросе в ответ на события BeginRequest и EndRequest. После этого модуль выполняется перед и после обработки запроса.
Если приложение ASP.NET выполняется в IIS 6.0, можно использовать HTTP-модули для настройки запросов на ресурсы, обслуживаемые ASP.NET. Среди этих ресурсов: веб-страницы ASP.NET (ASPX-файлы), веб-службы (ASMX-файлы), обработчики ASP.NET (ASHX-файлы) и прочие типы файлов в ASP.NET. Если приложение ASP.NET выполняется в IIS 7.0, можно использовать HTTP-модули для настройки запросов любых ресурсов, обслуживаемых IIS. Сюда относятся не только ресурсы ASP.NET, но также HTML-файлы (HTM или HTML), файлы изображений и другие. Дополнительные сведения см. в разделах Общие сведения о жизненном цикле приложения ASP.NET для IIS 5.0 и 6.0 и Общие сведения о жизненном цикле приложения ASP.NET для служб IIS 7.0.
Пример модуля в данном разделе добавляет сообщение в запрошенную веб-страницу ASP.NET в начало любого HTTP-запроса. Он также добавляет другое сообщение после обработки страницы. Данный модуль содержит код, который обеспечивает отсутствие добавленного текста в запросе на любые другие типы файлов.
Каждый обработчик пишется как закрытый метод модуля. При появлении зарегистрированных событий ASP.NET вызывает соответствующий модуль обработчика, который записывает в веб-страницу ASP.NET.
В данном пошаговом руководстве представлены следующие задачи:
Создание кода в HTTP-модуле.
Регистрация модуля в файле Web.config.
Обязательные компоненты
Для выполнения инструкций данного пошагового руководства необходимы следующие компоненты:
- Visual Studio или Visual Web Developer.
В этом руководстве предполагается также работа в IIS 6.0 или IIS 7.0. Однако функции модуля можно также увидеть при работе в ASP.NET Development Server.
Создание настраиваемого класса HTTP-модулей
Для начала предстоит создать класс файлов, реализующий модуль.
Чтобы создать настраиваемый HTTP-модуль класса:
Создайте веб-узел ASP.NET и назовите его Handler.
Примечание. В качестве имени веб-узла можно выбрать любое имя.
Если веб-узел еще не содержит папку App_Code, создайте его в корневой директории веб-узла.
В каталоге App_Code создайте файл класса под названием HelloWorldModule.vb (в Visual Basic) или HelloWorldModule.cs (в C#).
Примечание. Если используется Visual Studio (не Visual Web Developer, экспресс-выпуск), то можно также создать HelloWorldModule как проект библиотеки классов, скомпилировать его и поместить полученную сборку в каталог Bin веб-приложения.
Добавьте следующий код в файл класса:
Imports Microsoft.VisualBasic Imports System.Web Public Class HelloWorldModule Implements IHttpModule Public Sub New() End Sub Public ReadOnly Property ModuleName() As String Get Return "HelloWorldModule" End Get End Property ' In the Init function, register for HttpApplication ' events by adding your handlers. Public Sub Init(ByVal application As HttpApplication) _ Implements IHttpModule.Init AddHandler application.BeginRequest, _ AddressOf Me.Application_BeginRequest AddHandler application.EndRequest, _ AddressOf Me.Application_EndRequest End Sub Private Sub Application_BeginRequest(ByVal source As Object, _ ByVal e As EventArgs) ' Create HttpApplication and HttpContext objects to access ' request and response properties. Dim application As HttpApplication = DirectCast(source, _ HttpApplication) Dim context As HttpContext = application.Context Dim filePath As String = context.Request.FilePath Dim fileExtension As String = _ VirtualPathUtility.GetExtension(filePath) If fileExtension.Equals(".aspx") Then context.Response.Write("<h1><font color=red>" & _ "HelloWorldModule: Beginning of Request" & _ "</font></h1><hr>") End If End Sub Private Sub Application_EndRequest(ByVal source As Object, _ ByVal e As EventArgs) Dim application As HttpApplication = DirectCast(source, _ HttpApplication) Dim context As HttpContext = application.Context Dim filePath As String = context.Request.FilePath Dim fileExtension As String = _ VirtualPathUtility.GetExtension(filePath) If fileExtension.Equals(".aspx") Then context.Response.Write("<hr><h1><font color=red>" & _ "HelloWorldModule: End of Request</font></h1>") End If End Sub Public Sub Dispose() Implements System.Web.IHttpModule.Dispose End Sub End Class
using System; using System.Web; public class HelloWorldModule : IHttpModule { public HelloWorldModule() { } public String ModuleName { get { return "HelloWorldModule"; } } // In the Init function, register for HttpApplication // events by adding your handlers. public void Init(HttpApplication application) { application.BeginRequest += (new EventHandler(this.Application_BeginRequest)); application.EndRequest += (new EventHandler(this.Application_EndRequest)); } private void Application_BeginRequest(Object source, EventArgs e) { // Create HttpApplication and HttpContext objects to access // request and response properties. HttpApplication application = (HttpApplication)source; HttpContext context = application.Context; string filePath = context.Request.FilePath; string fileExtension = VirtualPathUtility.GetExtension(filePath); if (fileExtension.Equals(".aspx")) { context.Response.Write("<h1><font color=red>" + "HelloWorldModule: Beginning of Request" + "</font></h1><hr>"); } } private void Application_EndRequest(Object source, EventArgs e) { HttpApplication application = (HttpApplication)source; HttpContext context = application.Context; string filePath = context.Request.FilePath; string fileExtension = VirtualPathUtility.GetExtension(filePath); if (fileExtension.Equals(".aspx")) { context.Response.Write("<hr><h1><font color=red>" + "HelloWorldModule: End of Request</font></h1>"); } } public void Dispose() { } }
Сохраните изменения и закройте файл класса.
В меню Построение выберите команду Построение веб-узла.
Если веб-узел не удается создать, исправьте ошибки. Настраиваемые http-модули должны компилироваться (в противном случае не удастся зарегистрировать модуль).
Регистрация HTTP-модуля в IIS 6.0 и IIS 7.0 в классическом режиме
После создания класса HelloWorldModule необходимо зарегистрировать модуль путем создания элемента в файле Web.config. Регистрация http-модуля позволяет подключать его к уведомлениям конвейера запросов.
Приложение в IIS 7.0 может запускаться либо в классическом, либо в интегрированном режиме. В классическом режиме запросы обрабатываются практически так же, как в IIS 6.0. В интегрированном режиме IIS 7.0 управляет запросами с помощью конвейера, который позволяет использовать запросы, модули и другие функциональные возможности совместно с ASP.NET.
Процедура регистрации модуля различается в классическом режиме IIS 7.0 и интегрированном режиме IIS 7.0. Данный раздел описывает процедуру в случае IIS 6.0 в классическом режиме IIS 7.0. Процедура регистрации модуля в интегрированном режиме IIS 7.0 описывается в следующем подразделе.
Чтобы зарегистрировать модуль для IIS 6.0 и IIS 7.0 в классическом режиме:
Если веб-узел не содержит файл Web.config, создайте его в корневом каталоге веб-узла.
Добавьте в файл Web.config следующий выделенный код:
<configuration> <system.web> <httpModules> <add name="HelloWorldModule" type="HelloWorldModule"/> </httpModules> </system.web> </configuration>
Код регистрирует модуль с именем класса и именем модуля HelloWorldModule.
Регистрация HTTP-модуля в IIS 7.0 в интегрированном режиме
Процесс регистрации модуля в интегрированном режиме IIS 7.0 немного отличается от процесса в классическом режиме IIS 7.0.
Регистрация модуля в IIS 7.0 в интегрированном режиме
Если веб-узел не содержит файл Web.config, создайте его в корневом каталоге веб-узла.
Добавьте в файл Web.config следующий выделенный код:
<configuration> <system.webServer> <modules> <add name="HelloWorldModule" type="HelloWorldModule"/> </modules> </system.webServer> </configuration>
Примечание. Можно также зарегистрировать модуль при помощи IIS Manager. Для получения более подробной информации см. Configuring Modules in IIS 7.0.
Код регистрирует модуль с именем класса и именем модуля HelloWorldModule.
Проверка настраиваемого HTTP-модуля
После создания и регистрации пользовательского HTTP-модуля можно протестировать его.
Чтобы проверить настраиваемый HTTP-модуль:
Добавьте новую страницу ASP.NET в приложение.
Щелкните только что добавленную страницу правой кнопкой мыши и выберите команду Просмотреть в обозревателе.
HTTP-модуль добавил строку в начало и конец запроса. Модуль автоматически выполняется при любом запросе на файл, расширение которого связано с ASP.NET. Дополнительные сведения см. в разделе Общие сведения об обработчиках HTTP-данных и HTTP-модулях.
См. также
Основные понятия
Общие сведения о жизненном цикле приложения ASP.NET для IIS 5.0 и 6.0