IHttpModule

IHttpModule 是 ASP.NET 中的一个接口,用于定义 HTTP 模块的行为。HTTP 模块是 ASP.NET 应用程序中的一种组件,可以在 HTTP 请求的生命周期中插入自定义逻辑。通过实现 IHttpModule 接口,你可以创建自定义的 HTTP 模块,从而在请求处理的不同阶段执行特定的操作,例如日志记录、身份验证、授权、URL 重写等。

主要特点

  1. 生命周期集成:HTTP 模块可以参与到 ASP.NET 请求处理的生命周期中,从请求开始到请求结束的各个阶段。
  2. 事件驱动:通过订阅 HttpApplication 对象的事件(如 BeginRequestAuthenticateRequestAuthorizeRequest 等),可以在特定的请求阶段执行代码。
  3. 可重用性:HTTP 模块是独立的组件,可以在多个应用程序中重复使用。

接口方法

IHttpModule 接口定义了两个主要方法:
  1. Init(HttpApplication context):在模块初始化时调用,用于订阅 HttpApplication 的事件。
  2. Dispose():在模块被销毁时调用,用于释放资源。

示例代码

以下是一个简单的 IHttpModule 实现示例,用于记录请求的开始和结束时间:
csharp
复制
using System;
using System.Web;

public class SimpleHttpModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        // 订阅 BeginRequest 事件
        context.BeginRequest += new EventHandler(OnBeginRequest);
        // 订阅 EndRequest 事件
        context.EndRequest += new EventHandler(OnEndRequest);
    }

    private void OnBeginRequest(object sender, EventArgs e)
    {
        // 获取当前的 HttpApplication 对象
        HttpApplication app = (HttpApplication)sender;
        // 记录请求开始时间
        app.Context.Items["RequestStartTime"] = DateTime.Now;
    }

    private void OnEndRequest(object sender, EventArgs e)
    {
        // 获取当前的 HttpApplication 对象
        HttpApplication app = (HttpApplication)sender;
        // 获取请求开始时间
        DateTime startTime = (DateTime)app.Context.Items["RequestStartTime"];
        // 计算请求处理时间
        TimeSpan duration = DateTime.Now - startTime;
        // 将请求处理时间写入日志
        app.Context.Response.Write($"Request duration: {duration.TotalMilliseconds} ms");
    }

    public void Dispose()
    {
        // 释放资源
    }
}
 

配置

要使自定义的 HTTP 模块生效,需要在 web.config 文件中进行配置。以下是一个配置示例:
xml
复制
<configuration>
  <system.web>
    <httpModules>
      <add name="SimpleHttpModule" type="SimpleHttpModule"/>
    </httpModules>
  </system.web>
</configuration>
 
在 ASP.NET Core 中,虽然不再使用 IHttpModule,但可以通过中间件(Middleware)来实现类似的功能。中间件提供了更灵活的请求处理管道,可以更方便地插入自定义逻辑。
posted @ 2025-05-06 15:36  yinghualeihenmei  阅读(14)  评论(0)    收藏  举报