在本文中被描述的自定义 HTTP 模块说明了一个 HTTP 模块的基本功能。该模块被调用来回应两个事件:BeginRequest 事件和 EndRequest 事件。这允许模块在页面请求被处理之前和处理之后能够被运行。在这种情况下,该模块把一条消息添加到了任何 HTTP 请求的已请求 ASP.NET Web 页面之前,并且把其他消息添加到请求被处理之后。
提示:BeginRequest 和 EndRequest 事件是唯一出现在页面处理期间的两个事件。关于处理页面时被引发的事件的更多信息,请参考[ASP.NET Web 页面中的服务器事件处理]。
每个处理器都被编写成该模块的私有方法。当已注册事件被引发的时候,ASP.NET 就在处理器中调用适当的处理器方法,从而把信息写入到 ASP.NET Web 页面。
创建自定义 HTTP 模块类
- 如果你的 Web 站点没有 App_Code 目录,就在站点的根目录下创建一个。
- 在 App_Code 目录中创建一个名为 HelloWorldModule.vb(Visual Basic)或者 HelloWorldModule.cs(C#)的类文件。
提示:作为选择,你可以把 HelloWorldModule 类编译进一个库并且把结果 .dll 文件存放进 Web 应用程序的 Bin 目录。
- 添加下列代码到你的类文件:
public class HelloWorldModule : IHttpModule { public HelloWorldModule() { } public String ModuleName { get { return "HelloWorldModule"; } } // 在 Init 方法中,添加你的处理器来注册 HttpApplication 事件。 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) { // 创建 HttpApplication 和 HttpContext 对象来访问请求属性和回应属性。 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() { } }
注册 HTTP 模块
当你完成 HelloWorldModule 类的创建之后,你就可以在 Web.config 文件中创建一个入口来注册该模块。
在 Web.config 文件中注册模块
- 如果你的 Web 站点没有 Web.config 文件,就在站点的根目录下创建一个。
- 添加下列代码到 Web.config 文件:
<configuration> <system.web> <httpModules> <add name="HelloWorldModule" type="HelloWorldModule"/> </httpModules> </system.web> </configuration>
上述代码会使用 HelloWorldModule 的类名称和模块名称来注册模块。
测试自定义 HTTP 模块
在你创建并且注册自定义 HTTP 模块之后就可以测试了。
测试自定义 HTTP 模块
- 在你的应用程序中创建一个 Default.aspx 文件。
- 在浏览器中请求该 Default.aspx 页面。
HTTP 模块把一个字符串添加到了回应的开始与结束部分。该模块将会在任何对于扩展名被指派到 ASP.NET 的文件请求之上得到运行。关于更多信息,请参考[介绍 HTTP 模块]。