现在的位置: 首页 > 综合 > 正文

HttpHandler和HttpModule

2013年04月29日 ⁄ 综合 ⁄ 共 2478字 ⁄ 字号 评论关闭
ASP.NET的HTTP请求处理方法
当客户端向web服务器请求一个*.aspx的页面文件时,这个http请求也会被inetinfo.exe进程截获(www服务),它判断文件后缀之后,把这个请求转交给ASPNET_ISAPI.DLL而ASPNET_ISAPI.DLL则会通过一个Http PipeLine的管道,将这个http请求发送给ASPNET_WP.EXE进程,当这个HTTP请求进入ASPNET_WP.EXE进程之后,asp.net framework就会通过HttpRuntime来处理这个Http请求,处理完毕后将结果返回给客户端。
------------------------------------
当一个http请求被送入到HttpRuntime之后,这个Http请求会继续被送入到一个被称之为HttpApplication Factory的一个容器当中,而这个容器会给出一个HttpApplication实例来处理传递进来的http请求,而后这个Http请求会依次进入到如下几个容器中:
HttpModule --> HttpHandler Factory --> HttpHandler
当系统内部的HttpHandler的ProcessRequest方法处理完毕之后,整个Http Request就被处理完成了,客户端也就得到相应的东东了。
完整的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()
如果想在中途截获一个httpRequest并做些自己的处理,就应该在HttpRuntime运行时内部来做到这一点,确切的说时在HttpModule这个容器中做到这个的。

IHttpModule与IHttpHandler的区别主要有两点(实际上大家看MSDN时应该也注意到了):
    1.先后次序.先IHttpModule,后IHttpHandler.
    2.对请求的处理上:
IHttpModule是属于大小通吃类型,无论客户端请求的是什么文件,都会调用到它;例如aspx,rar,html的请求.
IHttpHandler则属于挑食类型,只有ASP.net注册过的文件类型(例如aspx,asmx等等)才会轮到调用它.

如果我们自定义了一个针对"*.aspx"的HttpHandler类的话,那么系统会将对此http请求的处理权完全交给我们自己定义的这个HttpHandler类来处理,而我们自己的HttpHandler类则需要自己完全解析这个Http请求,并作出处理。
IHttpHandler接口中最重要的方法ProcessRequest,这个方法就是HttpHandler用来处理一个Http请求,当一个Http请求经过由HttpModule容器传递到HttpHandler容器中的时候,framework会调用HttpHandler的ProcessRequest方法来做对这个Http请求做真正的处理。
framework实际上并不是直接把相关页面的HTTP请求定位到一个内部默认的IHttpHandler容器之上的,而是定位到了其 内部默认的IHttpHandler Factory上了。IHttpHandler Factory的作用就是对很多系统已经实现了的IHttpHandler容器进行调度和管理的,这样做的优点是大大增强了系统的负荷性,提升了效率。

生命周期中涉及到几个非常重要的对象:
HttpHandler,HttpModule,IHttpHandlerFactory,
他们的执行(顺序)大致的执行过程是这样的:client端发送页面请求,
被IIS的某个进程截获,它根据申请的页 面后缀(.aspx)不同,
调用不同的页面处理程序(.asp->asp.dll; .aspx->ISAPI.dll).而页面处理程序在处理过程中,
则要经历HttpModule,HttpHandler的处理:前者HttpModule用于页面处理前和处理后的一些事件的处理,
后者HttpHandler进行真正的页面的处理。

 <httpModules>
         <add name="test" type="MyHttpModuleTest.MyHttpModule,MyHttpModule"/>
       </httpModules>
   注意要区分大小写,因为web.config作为一个XML文件是大小写敏感的。
“type=MyHttpModuleTest.MyHttpModule,MyHttpModule”
告诉我们系统将会将http request请求交给位于MyHttpModule.dll文件中的MyHttpModuleTest.MyHttpModule类去处理。
HttpHandler是完全的对Http Request的截取。

 <httpModules>
         <add name="test" type="MyHttpModuleTest.MyHttpModule,MyHttpModule"/>
       </httpModules>
   注意要区分大小写,因为web.config作为一个XML文件是大小写敏感的。
“type=MyHttpModuleTest.MyHttpModule,MyHttpModule”
告诉我们系统将会将http request请求交给位于
MyHttpModule.dll文件中的MyHttpModuleTest.MyHttpModule类去处理。
HttpHandler是完全的对Http Request的截取。

抱歉!评论已关闭.