IHttpModule
IHttpModule
是 ASP.NET 中的一个接口,用于定义 HTTP 模块的行为。HTTP 模块是 ASP.NET 应用程序中的一种组件,可以在 HTTP 请求的生命周期中插入自定义逻辑。通过实现 IHttpModule
接口,你可以创建自定义的 HTTP 模块,从而在请求处理的不同阶段执行特定的操作,例如日志记录、身份验证、授权、URL 重写等。主要特点
-
生命周期集成:HTTP 模块可以参与到 ASP.NET 请求处理的生命周期中,从请求开始到请求结束的各个阶段。
-
事件驱动:通过订阅
HttpApplication
对象的事件(如BeginRequest
、AuthenticateRequest
、AuthorizeRequest
等),可以在特定的请求阶段执行代码。 -
可重用性:HTTP 模块是独立的组件,可以在多个应用程序中重复使用。
接口方法
IHttpModule
接口定义了两个主要方法:-
Init(HttpApplication context)
:在模块初始化时调用,用于订阅HttpApplication
的事件。 -
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)来实现类似的功能。中间件提供了更灵活的请求处理管道,可以更方便地插入自定义逻辑。