Пошаговое руководство. Создание и регистрация пользовательского 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-модуль класса:

  1. Создайте веб-узел ASP.NET и назовите его Handler.

    ms227673.alert_note(ru-ru,VS.90).gifПримечание.

    В качестве имени веб-узла можно выбрать любое имя.

  2. Если веб-узел еще не содержит папку App_Code, создайте его в корневой директории веб-узла.

  3. В каталоге App_Code создайте файл класса под названием HelloWorldModule.vb (в Visual Basic) или HelloWorldModule.cs (в C#).

    ms227673.alert_note(ru-ru,VS.90).gifПримечание.

    Если используется Visual Studio (не Visual Web Developer, экспресс-выпуск), то можно также создать HelloWorldModule как проект библиотеки классов, скомпилировать его и поместить полученную сборку в каталог Bin веб-приложения.

  4. Добавьте следующий код в файл класса:

    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() { }
    }
    
  5. Сохраните изменения и закройте файл класса.

  6. В меню Построение выберите команду Построение веб-узла.

    Если веб-узел не удается создать, исправьте ошибки. Настраиваемые 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 в классическом режиме:

  1. Если веб-узел не содержит файл Web.config, создайте его в корневом каталоге веб-узла.

  2. Добавьте в файл 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 в интегрированном режиме

  1. Если веб-узел не содержит файл Web.config, создайте его в корневом каталоге веб-узла.

  2. Добавьте в файл Web.config следующий выделенный код:

    <configuration>
      <system.webServer>    <modules>      <add name="HelloWorldModule" type="HelloWorldModule"/>    </modules>  </system.webServer>
    </configuration>
    
    ms227673.alert_note(ru-ru,VS.90).gifПримечание.

    Можно также зарегистрировать модуль при помощи IIS Manager. Для получения более подробной информации см. Configuring Modules in IIS 7.0.

    Код регистрирует модуль с именем класса и именем модуля HelloWorldModule.

Проверка настраиваемого HTTP-модуля

После создания и регистрации пользовательского HTTP-модуля можно протестировать его.

Чтобы проверить настраиваемый HTTP-модуль:

  1. Добавьте новую страницу ASP.NET в приложение.

  2. Щелкните только что добавленную страницу правой кнопкой мыши и выберите команду Просмотреть в обозревателе.

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

См. также

Основные понятия

Общие сведения о жизненном цикле приложения ASP.NET для IIS 5.0 и 6.0