如何使用 Visual C# .NET 创建 ASP.NET HTTP 模块

文章编号: 307996 - 查看本文应用于的产品
本文的发布号曾为 CHS307996
展开全部 | 关闭全部

本页

本分步指南演示如何使用 Visual C# .NET 创建一个简单的自定义 HTTP 模块。本文演示如何创建、部署和配置该模块,以及在 Global.asax 文件中如何挂接该模块的事件。

更多信息

实现模块

  1. 新建一个名为 MyModule 的 Visual Studio .NET C# 类库项目。
  2. 设置一个对 System.Web.dll 程序集的引用。
  3. 将以下指令添加到该类中:
    using System.Web;					
  4. 重命名 SyncModule.cs 类,然后相应地更改类定义。
  5. 实现 IHttpModule 接口。您的类定义应如下所示:
    public class SyncModule : IHttpModule					
  6. 决定要预订哪些事件。下表概括了可从 HttpApplication 对象预订的事件:
    • AcquireRequestState:调用此事件可允许模块获取或创建请求的状态(例如,会话)。
    • AuthenticateRequest:当安全模块在处理请求前需要对用户进行身份验证时,调用此事件。
    • AuthorizeRequest:当请求需要经过授权时,安全模块就会调用此事件。此事件是在身份验证后调用的。
    • BeginRequest:调用此事件以通知模块新请求即将开始。
    • Disposed:调用此事件以通知模块由于某种原因应用程序即将终止。允许模块进行内部清理。
    • EndRequest:调用此事件以通知模块该请求即将结束。
    • Error:调用此事件以通知模块在请求处理过程中发生了错误。
    • PostRequestHandlerExecute:调用此事件以通知模块处理程序已完成对请求的处理。
    • PreRequestHandlerExecute:调用此事件以通知模块将调用用于处理请求的处理程序。
    • PreSendRequestContent:调用此事件以通知模块将向客户端发送请求内容。
    • PreSendRequestHeaders:调用此事件以通知模块将向客户端发送 HTTP 头。
    • ReleaseRequestState:调用此事件以允许模块在处理程序完成对请求的处理后释放状态。
    • ResolveRequestCache:在身份验证后调用此事件。缓存模块使用此事件确定该请求是否应该由其缓存处理,或者处理程序是否应该处理该请求。
    • UpdateRequestCache:在处理程序响应后调用此事件。缓存模块应根据该响应来更新其缓存。
    本示例使用了 BeginRequest 事件。
  7. 按以下方式实现 IHttpModule 接口的 InitDispose 方法:
    public void Init(HttpApplication app)
    {
       app.BeginRequest += new EventHandler(OnBeginRequest);
    }
    
    public void Dispose(){ }					
  8. 按以下方式为事件创建一个委托:
    public delegate void MyEventHandler(Object s, EventArgs e);					
  9. 定义一个 MyEventHandler 类型的私有局部变量以记录对该事件的引用:
    private MyEventHandler _eventHandler = null;					
  10. 创建一个事件将该委托挂接到 Global.asax 文件中的方法或从 HttpApplication 对象继承的类:
    public event MyEventHandler MyEvent
    {
       add { _eventHandler += value; }
       remove { _eventHandler -= value; }
    }					
  11. 创建 OnBeginRequest 方法,该方法挂接到 HttpApplicationBeginRequest 事件:
    public void OnBeginRequest(Object s, EventArgs e)
    {
       HttpApplication app = s as HttpApplication;
       app.Context.Response.Write("Hello from OnBeginRequest in custom module.<br>");
       if(_eventHandler!=null)
          _eventHandler(this, null);
    }					
  12. 编译该项目。

部署模块

  1. 在 C:\Inetpub\Wwwroot 下新建一个名为 Module 的目录。
  2. 在新创建的 Module 目录下创建一个名为 Bin 的子目录。这样,其路径为 C:\Inetpub\Wwwroot\Module\Bin。
  3. 将 MyModule.dll 从项目的 Bin\Debug 目录复制到 C:\Inetpub\Wwwroot\Module\Bin 目录。
  4. 按照下列步骤将新的 Module 目录标记为一个 Web 应用程序:
    1. 打开 Internet 服务管理器。
    2. 右键单击 Module 目录,然后单击属性
    3. 目录选项卡上,单击创建
    4. 单击确定以关闭 Module 属性对话框。

配置系统

  1. 在 C:\Inetpub\Wwwroot\Module\ 目录下,新建一个名为 Web.config 的文件。
  2. 将以下文本粘贴到 Web.config 文件中:
    <configuration>
       <system.web>
          <httpModules>
             <add name="MyModule" type="MyModule.SyncModule, MyModule" />
          </httpModules>
       </system.web>
    </configuration>					

测试模块

  1. 在 C:\Inetpub\Wwwroot\Module 目录下,新建一个名为 Test.aspx 的 .aspx 文件。
  2. 将以下文本粘贴到 Test.aspx 文件中:
    <%@Page Language="C#"%>
    <% Response.Write("Hello from Test.aspx.<br>"); %>					
  3. 在 C:\Inetpub\Wwwroot\Module 目录下,创建一个 Global.asax 文件。
  4. 将以下代码粘贴到 Global.asax 文件中:
    <%@ Import Namespace="MyModule" %>
    
    <script language="C#" runat=server >
    protected void MyModule_OnMyEvent(Object src, EventArgs e)
    {	
      Context.Response.Write("Hello from MyModule_OnMyEvent called in Global.asax.<br>");
    }
    </script>					
  5. 请求 Test.aspx 页。应该会看到以下文本行:
    Hello from OnBeginRequest in custom module.
    Hello from MyModule_OnMyEvent called in Global.asax.
    Hello from Test.aspx.					

参考

有关 HttpHandlers 的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
307985 INFO:ASP.NET HTTP 模块和 HTTP 处理程序概述

属性

文章编号: 307996 - 最后修改: 2005年12月23日 - 修订: 3.6
这篇文章中的信息适用于:
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
  • Microsoft Visual C# .NET 2003 标准版
  • Microsoft Visual C# .NET 2002 标准版
关键字:?
kbconfig kbhowtomaster kbhttpmodule kbhttpruntime kbweb KB307996
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈