HttpModule和在Global.asax区别

HttpModule事件同Global.asax中的事件相对应,对应关系如下:

HttpModule

Global.asax

BeginRequest

Application_BeginRequest

AuthenticateRequest

Application_AuthenticateRequest

EndRequest

Application_EndRequest

当一个HTTPREQUEST发起之后,先后回经过几个阶段,大致是HttpModule然后HttpHandle,然后Aspx后端处理这个是针对一个特有的请求,可以针对特有的请求,做特定的限制和操作。而Global.asax这个只是一个全局的处理

 

首先从范围来讲,Global.asax要包括在HttpModule,因为在整个请求的过程中,HttpModule只是从用户发出请求的时候才触发相关,比如服务器启动后要做的事情,它就不能触发,当整个请求都交给httphandler后,那么它就不起作用了,直到httphandler处理完后才可以使用里面的方法,所以在httphandler处理请求的时候,session是有效的,所以Global.asax可以处理相关的session_end,session_start等事件,而httpMudel却不能,还有服务器停止的时候,需要触发的相关事件等等也只能在Global.asax中触发,还有有些功能,比如统计一个网站的在线人说或者访问量的时候也只能用Global.asax处理,但是共同的范围内还有很多事件可以一起处理的,比如防止sql注入,会在请求的时候过滤一些字符串,这个时候就可以使用它们中的相关事件去处理

 

其次就是从个数来说,简单说一下HttpMudel可以多个 Global.asax只有一个,因为对于不同的请求模块,可以创建不同的HttpMudel,而全局应用程序Global.asax却只能有一个

 

另外可以在应用程序的 Global.asax 文件中实现模块的许多功能,这使您可以响应应用程序事件。但是,模块相对于 Global.asax 文件具有如下优点:模块可以进行封装,因此可以在创建一次后在许多不同的应用程序中使用。通过将它们添加到全局程序集缓存 (GAC) 并将它们注册到 Machine.config 文件中,可以跨应用程序重新使用它们。有关更多信息,但是,使用 Global.asax 文件有一个好处,那就是您可以将代码放在其他已注册的模块事件(如 Session_Start 和 Session_End 方法)中。此外,Global.asax 文件还允许您实例化可在整个应用程序中使用的全局对象。当您需要创建依赖应用程序事件的代码并且希望在其他应用程序中重用模块时,或者不希望将复杂代码放在 Global.asax 文件中时,应当使用模块。当您需要创建依赖应用程序事件的代码但不需要跨应用程序重用它时,或者需要订阅不可用于模块的事件(如 Session_Start)时,应当将代码放在 Global.asax 文件中。

 

总的来说,HttpModule是处理请求的,但是不是全局的,而Global.asax则可以看成是全局的,比如,Application_Start,Session_Start等都可以在这里处理,而不能在HttpModule处理

posted @ 2012-06-25 18:16  大智若简  阅读(305)  评论(0编辑  收藏  举报