本文作者:MSDN
原文链接:http://msdn.microsoft.com/zh-cn/library/ms227673(VS.80).aspx


如何:创建自定义 HTTP 模块

本主题中描述的自定义 HTTP 模块阐释了 HTTP 模块的基本功能。在响应下面两个事件时调用该模块:EndRequest 事件。这使该模块可以在处理页请求之前和之后运行。在这种情况下,该模块向请求的 ASP.NET 网页的任一 HTTP 请求开头处添加一条消息,并在处理请求后添加另一条消息。

如何:创建自定义 HTTP 模块注意

BeginRequestEndRequest 事件只是在处理页期间发生的两个事件。有关在处理页期间引发的事件的更多信息,请参见 ASP.NET 网页中的服务器事件处理

每个事件处理程序都编写为模块的私有方法。在引发已注册事件时,ASP.NET 调用该模块中适当的处理程序方法,该方法将信息写入 ASP.NET 网页中。

创建自定义 HTTP 模块类

  1. 如果网站还没有 App_Code 文件夹,请在该站点的根目录下创建这样的一个文件夹。

  2. 在 App_Code 目录中,创建一个名为 HelloWorldModule.vb(对于 Visual Basic)或名为 HelloWorldModule.cs(对于 C#)的类文件。

如何:创建自定义 HTTP 模块注意

或者,可以将 HelloWorldModule 类编译到一个库中,并将得到的 .dll 文件放在 Web 应用程序的 Bin 目录中。

  1. 将以下代码添加到该类文件中:

    Visual Basic
    Imports Microsoft.VisualBasic
        Public Class HelloWorldModule
        Implements IHttpModule
        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 = CType(source, _
        HttpApplication)
        Dim context As HttpContext = application.Context
        context.Response.Write _
        ("<h1><font color=red>HelloWorldModule: " & _
        "Beginning of Request</font></h1><hr>")
        End Sub
        Private Sub Application_EndRequest(ByVal source As Object, _
        ByVal e As EventArgs)
        Dim application As HttpApplication = CType(source, _
        HttpApplication)
        Dim context As HttpContext = application.Context
        context.Response.Write _
        ("<hr><h1><font color=red>HelloWorldModule: " & _
        "End of Request</font></h1>")
        End Sub
        Public Sub Dispose() Implements IHttpModule.Dispose
        End Sub
        End Class
        

     

    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;
        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;
        context.Response.Write("<hr><h1><font color=red>
        HelloWorldModule: End of Request</font></h1>");
        }
        public void Dispose()
        {
        }
        }
        

在创建完 HelloWorldModule 类后,可以通过在 Web.config 文件中创建一项来注册该模块。

在 Web.config 文件中注册该模块

  1. 如果网站还没有 Web.config 文件,请在该站点的根目录下创建一个这样的文件。

  2. 将下面突出显示的代码添加到该 Web.config 文件中:

    <configuration>
        <system.web>
        <httpModules>           <add name="HelloWorldModule" type="HelloWorldModule"/>        </httpModules>
        </system.web>
        </configuration>

    这段代码用 HelloWorldModule 的类名和模块名注册该模块。

测试自定义 HTTP 模块

创建并注册完自定义 HTTP 模块后,可以对它进行测试。

测试自定义 HTTP 模块

  1. 在应用程序中创建一个 Default.aspx 页。

  2. 在浏览器中请求该 Default.aspx 页。

    HTTP 模块会将一个字符串追加到响应的开头和结尾。在请求扩展名指定为 ASP.NET 类型的文件时,该模块将会自动运行。有关更多信息,请参见 HTTP 模块介绍

请参见

相关文章: