应用程序管道开发HttpModule
HttpContext
服务器端对请求处理需要大量参数传递,为了简化服务器端对参数的传递工作,将请求信息和对请求的处理信息封装到HttpContext
实例中,每次请求新建一个实例。
用户可以通过HttpContext.Current
得到当前实例。所以下面的处理就是对HttpContex
的处理。
类型 | 属性名 | 说明 |
---|---|---|
HttpRequest | Request | 请求参数对象 |
HttpResponse | Response | 回应处理对象 |
HttpServerUtility | Server | 服务实用工具 |
IDictionary | Items | 请求过程中传递参数 |
IPrincipal | User | 当前用户对象 |
IHttpHandler | Handler | 处理当前请求的处理对象 |
Cache | Cache | Web服务器的缓存管理对象 |
HttpSessionState | Session | 当前请求的会话状态 |
HttpApplicationState | Application | 全局状态管理对象 |
ProfileBase | Profile | 当前请求的个性化数据对象 |
DateTime | Timestamp | 当前请求开始处理的时间点 |
HttpApplication
HttpRuntime
通过HttplicationFactory
维护HttpApplicaton
应用程序池,HttpApplicaton
作用处理HttpContext
请求实例,且每次只能处理一个请求。
HttpApplication
通过事件管道的方式处理请求,实现方式:实现接口System.ComponentModel.Component
,内部维护一事件集合。
HttpAlication的事件管道如下,我们可以通过自定义HttpModule
对管道中的事件处理。
事件名称 | 说明 |
---|---|
BeginRequest | ASP.NET 针对请求处理的第一个事件 |
AuthenticateRequest | 开始检查用户身份 |
PostAuthenticateRequest | 检查用户身份结束 |
AuthorizeRequest | 开始用户请求权限检查 |
PostAuthorizeRequest | 用户请求权限检查结束 |
ResolveRequestCache | 从当前缓存中检查用户请求 |
PostResolveRequestCache | 缓存检查结束 |
PostMapRequestHandler | 获取处理程序Handler结束 |
AcquireRequestState | 获取当前用户以前的信息,用的Session |
PostAcquireRequestState | 获取当前用户以前的信息结束 |
PreRequestHandlerExecute | 开始处理程序Handler |
PostRequestHandlerExecute | 结束处理程序Handler |
ReleaseRequestState | 释放请求的状态 |
PostReleaseRequestState | 已释放请求的状态 |
UpdateRequestCache | 开始更新缓存 |
PostUpdateRequestCache | 结束更新缓存 |
LogRequest | 日志工作 |
PostLogRequest | 完成日志工作 |
EndRequest | 结束本次请求 |
自定义HttpModule
自定义HttpModule
需要实现IHttpModule
接口,并将类注册。注册的方式由两种一种通过config文件,二通过属性加载程序集。自定义HttpModule可以定义自己的事件,可以在Global文件中注册事件。
当然还有者简单的方法直接在Global文件下通过函数扩展。
public class MyModule : IHttpModule
{
public event EventHandler ExposeEvent;
public void Dispose()
{
throw new NotImplementedException();
}
public void Init(HttpApplication context)
{
context.BeginRequest += (app, e) => {
((HttpApplication)app).Context.Response.Write("ASP.NET 针对请求处理的第一个事件<br />");
};
context.AuthenticateRequest += (app, e) => {
((HttpApplication)app).Context.Response.Write("开始检查用户身份<br />");
OnExposeEvent(app,e);
};
context.PostAuthenticateRequest += (app, e) => { ((HttpApplication)app).Context.Response.Write("检查用户身份结束<br />"); };
context.AuthorizeRequest += (app, e) => { ((HttpApplication)app).Context.Response.Write("开始用户请求权限检查<br />"); };
context.PostAuthorizeRequest += (app, e) => { ((HttpApplication)app).Context.Response.Write("用户请求权限检查结束<br />"); };
context.ResolveRequestCache += (app, e) => { ((HttpApplication)app).Context.Response.Write("从当前缓存中检查用户请求<br />"); };
context.PostResolveRequestCache += (app, e) => { ((HttpApplication)app).Context.Response.Write("缓存检查结束<br />"); };
//context.MapRequestHandler += (app, e) => { ((HttpApplication)app).Context.Response.Write("缓存没能检查到请求结果,开始获取请求程序Handler<br />"); };
context.PostMapRequestHandler += (app, e) => { ((HttpApplication)app).Context.Response.Write("获取处理程序Handler结束<br />"); };
context.AcquireRequestState += (app, e) => { ((HttpApplication)app).Context.Response.Write("获取当前用户以前的信息,用的Session<br />"); };
context.PostAcquireRequestState += (app, e) => { ((HttpApplication)app).Context.Response.Write("获取当前用户以前的信息结束<br />"); };
context.PreRequestHandlerExecute += (app, e) => { ((HttpApplication)app).Context.Response.Write("开始处理程序Handler<br />"); };
context.PostRequestHandlerExecute += (app, e) => { ((HttpApplication)app).Context.Response.Write("结束处理程序Handler<br />"); };
context.ReleaseRequestState += (app, e) => { ((HttpApplication)app).Context.Response.Write("释放请求的状态<br />"); };
context.PostReleaseRequestState += (app, e) => { ((HttpApplication)app).Context.Response.Write("已释放请求的状态<br />"); };
context.UpdateRequestCache += (app, e) => { ((HttpApplication)app).Context.Response.Write("开始更新缓存<br />"); };
context.PostUpdateRequestCache += (app, e) => { ((HttpApplication)app).Context.Response.Write("结束更新缓存<br />"); };
context.LogRequest += (app, e) => { ((HttpApplication)app).Context.Response.Write("日志工作<br />"); };
context.PostLogRequest += (app, e) => { ((HttpApplication)app).Context.Response.Write("完成日志工作<br />"); };
context.EndRequest += (app, e) => { ((HttpApplication)app).Context.Response.Write("结束本次请求<br />"); };
}
protected void OnExposeEvent(object sender,EventArgs e)
{
if(ExposeEvent != null)
{
ExposeEvent(sender, e);
}
}
}
注册
<system.webServer>
<modules>
<add name="MyModule" type="Demo01.MyModule,Demo01"/>
</modules>
</system.webServer>
注意 这是IIS7后的继承模式的注册,这种模式不论请求时是动态资源还是静态资源,都会通过HttpModule
。Iss7之前或IIS经典模式中静态资源不经asp.net直接由IIS返回。
global文件中注册事件
void MyModule_ExposeEvent(object sender,EventArgs e)
{
HttpApplication app = sender as HttpApplication;
app.Context.Response.Write("Hello<br />");
}