HttpHandler和HttpModule

HttpHandler和HttpModule


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的截取。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值