ASP.NET HttpModule的使用说明

来源:互联网 发布:影音后期制作软件大全 编辑:程序博客网 时间:2024/05/19 02:18

摘要: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>




原创粉丝点击