摘要:HttpModule可以用于全局身份验证、url重写、异常处理等场景。本文以身份验证为场景,介绍HttpModule的使用。
ASP.NET请求处理过程是基于管道模型的,这个管道模型是由多个HttpModule和HttpHandler组成,ASP.NET把http请求依次传递给管道中各个HttpModule,最终被HttpHandler处理,处理完成后,再次经过管道中的HTTP模块,把结果返回给客户端。我们可以在每个HttpModule中都可以干预请求的处理过程。
注意:在http请求的处理过程中,只能调用一个HttpHandler,但可以调用多个HttpModule。
当请求到达HttpModule的时候,系统还没有对这个请求真正处理,但是我们可以在这个请求传递到处理中心(HttpHandler)之前附加一些其它信息,或者截获的这个请求并作一些额外的工作,也或者终止请求等。在HttpHandler处理完请求之后,我们可以再在相应的HttpModule中把请求处理的结果进行再次加工返回客户端。
1 HttpModule工作原理
负责监听HttpRequest,同时对HttpRequest增添或者过滤掉一部分内容。也就是说,当一个HTTP请求到 达HttpModule时,整个ASP.NET Framework系统还并没有对这个HTTP请求做任何处理,也就是说此时对于HTTP请求来讲,HttpModule是一个HTTP请求的“必经之 路”,所以可以在这个HTTP请求传递到真正的请求处理中心(HttpHandler)之前附加一些需要的信息在这个HTTP请求信息之上,或者针对截获 的这个HTTP请求信息作一些额外的工作,或者在某些情况下干脆终止满足一些条件的HTTP请求,从而可以起到一个Filter过滤器的作用。
HttpModule实现了接口IHttpModule,我们可以自定义实现该接口的类,从而取代HttpModule。
1.1 HttpModule事件
BeginRequest | 指示请求处理开始 |
AuthenticateRequest | 封装请求身份验证过程 |
AuthorizeRequest | 封装检查是否能利用以前缓存的输出页面处理请求的过程 |
ResolveRequestCache | 从缓存中得到相应时候触发 |
AcquireRequestState | 加载初始化Session时候触发 |
PreRequestHandlerExecute | 在Http请求进入HttpHandler之前触发 |
PostRequestHandlerExecute | 在Http请求进入HttpHandler之后触发 |
ReleaseRequestState | 存储Session状态时候触发 |
UpdateRequestCache | 更新缓存信息时触发 |
EndRequest | 在Http请求处理完成的时候触发 |
PreSendRequestHenaders | 在向客户端发送Header之前触发 |
PreSendRequestConternt | 在向客户端发送内容之前触发 |
1.2 HttpModule生命周期
2 项目范例代码
2.1 实现IHttpModule接口
public class CustomHttpModule : IHttpModule
{
//单点登录URL
public string LoginUrl = "http://www.sample.com/Login/Index?ReturnUrl=http://www.sample.com/Book/Search";
public void Dispose()
{
throw new NotImplementedException();
}
public void Init(HttpApplication context)
{
context.BeginRequest += Context_BeginRequest; //bind BeginRequest event, handle event
}
private void Context_BeginRequest(object sender, EventArgs e)
{
HttpApplication HA = (HttpApplication)sender; //获得发生该事件的对象
var rlLoginCookie = HA.Context.Request.Cookies["LoginNameInCookie"];
//如果未授权,则跳转到登陆页面
if (rlLoginCookie == null)
{
HA.Response.Redirect(LoginUrl);
}
}
}
2.2 注册HttpModule
IIS7.0以前的版本中,注册代码放在web.config文件下,configuration->system.web以下
注册代码为:
<httpModules>
<add name="ModuleClassName" type="NameSpace. ModuleClassName, NameSpace"/>
</httpModules>
IIS7及更新版本中,配置信息需要在configuration->system.webServer以下
注册代码为
<modules>
<add name="ModuleClassName" type="Namespace.ModuleClassName"/>
</modules>