asp.net提供httpmodules作为一种hook into请求和响应操作的方法,
httpModules参与到应用程序一级中,在请求传入服务器时就可以获取它,并接着在响应返回浏览器时再次触发.httpModules对象可以获取一个httpApplication对象的引用,并将事件处理器绑定到应用程序的事件中.
使用httphandlers可以通过获得当前httpContext的引用来处理一个对特定文件拓展名或者指定路径的http请求。
他们的顺序是httpmodules——>httphandlers——>httpmodules
说通俗一点就是
1.httpmodules是应用程序级的,它可以处理每次http请求的不同阶段的事件
如:BeginRequest(在 ASP.NET 响应请求时作为 HTTP 执行管线链中的第一个事件发生。 )
EndRequest(在 ASP.NET 响应请求时作为 HTTP 执行管线链中的最后事件发生。 )
PreRequestHandlerExecute(在 ASP.NET Handler初始化完成,并且在页面初始化前发生 )
2.httphandlers一般是页面级的(每次都是一次http请求),他实际就是处理每次http请求的本身,
.net页面(或者其它后缀名,想处理http请求的)本身也是继承IHttpHandler的,还有比如.ashx页也是一个专门处理http请求的文件,所以系统又允许我们继承IHttpHandler
并通过扩展 public void ProcessRequest (HttpContext context) 方法来自定义一些http请求的处理,它的功能就是处理Http请求的,可以说httpmodules
是对它的一次应用程序级的扩展,处理他的(前后左右)但他还是核心
举个例子:可能不太恰当(人去超市,推车从入口进去,买完东西结帐从出口出来)
首先人买东西是核心,是一次http请求,到超市门口,httpmodules提供了一辆车(当然也可以不要,但是不能带商品进去,所以车可以自定义,但商品不能自定义),然后到
超市里,逛超市就是HttpHandler是一次http请求处理,出来结帐httpmodules又提供结帐功能然后走人。处理完成。
在这里说一下,大家一定要清楚一件事,初学.net不要以为http请求是依赖与aspx页,http请求不依赖与.net程序本身,.net只不过根据它的标准做了
一个处理程序HttpHandler所以,处理http请求可以是任何东西,.net的webform模式只不过是其中之一还有其它像mvc也是一种(比如上边的例子,买东西是http请求,你上超市是买东西,上仓卖是买东西,上市场也是买东西,所不同的只是处理平台不同) ,而且aspx页和它的后台aspx.cs页也没有必然的联系,他们也是通过中间的映射和一系列标准联系起来的,
codefile页也不是必须提交到他的后台页改成其它的处理http请求的地方也行,比如.ashx页,但是这样就是简单的http请求了,不是事件驱动的了,aspx.cs页实际就是把http请求封装扩展了一次,但是处理的还是最基础的http请求
3.关于Global.asax和 httpmodules
硬要说关系,Application对象就是从Global.asax产生的,httpmodules在Global.asax之后,Global.asax比httpmodules多出一些注册事件(比如httpmodules就无法注册session事件),但是Global.asax属于系统级的文件,httpmodules属于一个类,可以说httpmodules重用性好。
整体的顺序是
http请求——>IIS(web服务器)——>运行时——>Global.asax(Application)——>httpmodules——>HttpHandler
<———————————————————————————————————————————————————再回去