HttpModule 和 HttpHandler

HttpModule和HttpHandler回顾:

HttpModule

1.完整的http请求在asp.net framework中的处理流程:
HttpRequest-->inetinfo.exe->ASPNET_ISAPI.DLL-->Http Pipeline-->ASPNET_WP.EXE-->HttpRuntime-->HttpApplication Factory-->HttpApplication-->HttpModule-->HttpHandler Factory-->HttpHandler-->HttpHandler.ProcessRequest()
ps:红色的HttpApplication实例在HttpModuleInit方法中会用到。

2.HttpModule工作原理

负责监听HttpRequest,同时对HttpRequest增添或者过滤掉一部分内容。也就是说,当一个HTTP请求到达HttpModule时,整个ASP.NET Framework系统还并没有对这个HTTP请求做任何处理,也就是说此时对于HTTP请求来讲,HttpModule是一个HTTP请求的“必经之路”,所以可以在这个HTTP请求传递到真正的请求处理中心(HttpHandler)之前附加一些需要的信息在这个HTTP请求信息之上,或者针对截获的这个HTTP请求信息作一些额外的工作,或者在某些情况下干脆终止满足一些条件的HTTP请求,从而可以起到一个Filter过滤器的作用。
HttpModule实现了接口IHttpModule,我们可以自定义实现该接口的类,从而取代HttpModule。
asp.net默认的HttpModule如下:

        System.Web.SessionState.SessionStateModule;
        System.Web.Security.WindowsAuthenticationModule;
        System.Web.Security.FormsAuthenticationModule;
        System.Web.Security.PassportAuthenticationModule;
        System.Web.Security.UrlAuthorizationModule;
        System.Web.Security.FileAuthorizationModule;

3、编写自己的HttpModule
要实现HttpModule,必须实现接口IHttpModule。

web.config的节点配置
在Web.config的system.web标签中添加:
        <httpModules>
            <add name="XXX" type="XXHttpModule.XyHttpModule,XXHttpModule"></add>
        </httpModules>
a、name可以随意指定,没有影响。
b、type有两个参数,第一个表示具体哪个类,第二个表示是哪个dll。

4.加载两个或多个自定义的HttpModule
这里以两个自定义HttpModule举例.
修改配置文件中的httpModules节点:
<add name="XXX" type="XXHttpModule.XyHttpModule1,XXHttpModule"></add>
<add name="XXX" type="XXHttpModule.XyHttpModule2,XXHttpModule"></add>

运行:
a、在web.config文件中引入自定义HttpModule的顺序决定了多个自定义HttpModule在处理一个HTTP请求的顺序;
b、系统默认HttpModule是最先被ASP.NET Framework所加载上去的,对外部是透明的。

c、对于一个HttpModule,在BeginRquest中终止,但是仍然会调用EndRequest事件,以及PreSendRequestHeaders事件和PreSendRequestContent事件。也可以说是直接跳转到EndRequest事件,而不会调用这期间的事件

d、如果有两个HttpModule,在第一个HttpModule的BeginRequest中终止,仅仅不会调用第二个HttpModule的BeginRequest,但仍然会调用两个EndRequest事件,以及PreSendRequestHeaders事件和PreSendRequestContent事件。

 

HttpHandler

HttpHandler是一个HTTP请求的真正处理中心。在HttpHandler容器中,ASP.NET Framework才调用HttpHandler的ProcessRequest成员方法来对这个HTTP请求进行真正的处理,真正地对客户端请求的服务器页面做出编译和执行,并将处理过后的信息附加在HTTP请求信息流中再次返回到HttpModule中。

以aspx页面为例,正是在HttpHandler这里,一个aspx页面才被系统处理解析,并将处理完成的结果继续经由HttpModule传递下去,直至到达客户端。当然,对于aspx页面,ASP.NET Framework在默认情况下是交给System.Web.UI.PageHandlerFactory这个HttpHandlerFactory来处理的。当一个HTTP请求到达这个HttpHandlerFactory时,HttpHandlerFactory会提供出一个HttpHandler容器,交由这个HttpHandler容器来处理这个HTTP请求。 一个HTTP请求都是最终交给一个HttpHandler容器中的ProcessRequest方法来处理的。

1.实现HttpHandler,必须继承自IHttpHandler接口。

要在HttpHandler使用Session,必须要实现IRequiresSessionState接口
配置文件
在web.config文件的system.web节点下,添加:
      <httpHandlers>        
        <add verb="*" path="*" type="XXHandler.X1TestHandler, XXHandler"/>
      </httpHandlers>

 

HttpHandler和HttpModule的区别
主要有两点:
 (1)先后次序.先IHttpModule,后IHttpHandler,IHttpHandler处理结束后再交给IHttpModule;
 (2)对请求的处理上:
        IHttpModule是针对所有的请求文件,无论客户端请求的是什么文件类型,都会调用到它;例如aspx,html,rar的请求;
        IHttpHandler是针对一类型的文件,只有asp.net注册过的文件类型才会调用它。

 

 

HttpModuleu应用场景:

1.统一内容处理,EndRequest处理

2.身份验证: AcquireRequestState和PreRequestHandlerExecute处理

3.页面限流,页面访问量统计:BeginRequest处理

posted @ 2017-02-09 16:25  shw0099  阅读(182)  评论(0编辑  收藏  举报