HttpModule和HttpHandler

来源:互联网 发布:文豆php培训中心深圳 编辑:程序博客网 时间:2024/05/16 12:59

HttpApplication对象中有影响当前应用程序的Modules集合。HttpModule负责监听HttpRequest,在Http请求到达真正的处理中心HttpHandler之前,对HttpRequest增加或者过滤掉部分内容,或者在某些情况下终止HttpRequest请求,从而起到Filter过滤器的作用。默认内置了很多HttpModule,有FileAuthorizationFormsAuthenticationWindowsAuthenticationPassportAuthentication Profile等。

1. BenginRequestEndRequest分别是HttpModule容器最开始的和最后的事件。EndRequest之后还会触发PreSendRequestHeaders事件和PreSendRequestContent事件,表示HttpModule结束,即将开始向Client发送数据。

2.  在HttpModule的ResolveRequestCache事件中,将请求传给HttpHandler容器。但是此时并没有将HTTP请求控制权交出,而是继续触发AcquireRequestState事件以及PreRequestHandlerExcute事件。在PreRequestHandlerExcute之后,HttpModule将HttpRequest传递给HttpHandler容器。开始真正的Http请求处理工作。建立HttpHandler实例,Session从此生效。

3.  HttpHandler容器调用自身的ProcessRequest方法处理HttpRequest,将其控制权交给HttpModule,此后Session失效。

4.  可以在BeginRequest事件中,使用HttpApplication.CompleteRequest方法终止此HttpRequest请求。

5. 终止过程:对于一个HttpModule,在BeginRquest中终止,但是仍然会调用EndRequest事件,以及PreSendRequestHeaders事件和PreSendRequestContent事件。也可以说是直接跳转到EndRequest事件,而不会调用这期间的事件。如果有两个HttpModule,在第一个HttpModuleBeginRequest中终止,仅仅不会调用第二个HttpModule BeginRequest,但仍然会调用两个EndRequest事件,以及PreSendRequestHeaders事件和 PreSendRequestContent事件。

6. 在web.config当中引入的HttpModule顺序决定了多个HttpModule在处理HttpRequest的顺序。

HttpHandler是一个HttpRequest的真正处理中心,在HttpHandler容器中,.net framework对客户端请求的服务器页面做出编译和执行,并将处理过的信息附加在Http请求信息中,再次返回到HttpModule中。

1.    IHttpHandler定义了如果要实现一个HTTP请求的处理所必需实现的一些系统约定。HttpHandlerHttpModule不同,一旦定义了自己的HttpHandler类,那么它对系统的HttpHandler的关系将是“覆盖”关系。

2.    当一个请求到达的时候,HttpHandlerFactory生成一个HttpHandler容器,来处理Http请求。最终调用HttpHandlerProcessRequest方法处理Http请求,并将结果发送到浏览器。

3.    Asp.netframework不直接将请求定位到其内部默认的IHttpHandler容器上,而是定位到其默认的IHttpHandlerFactory上,工厂的作用是对IHttpHandler进行调度和管理。对于aspx文件请求,是到System.Web.UI.PageHandlerFactory上。

4.    IHttpHandlerFactory接口包含两个方法。GetHandler返回实现IHttpHandler接口的类的实例,ReleaseHandler使工厂可以重用现有的处理程序实例

IHttpHandler接口包含一个方法一个属性,方法接口ProcessRequest,用来处理请求。属性接口IsReusable,用来指示后续的Http请求是否可以继续使用此接口的实例。
原创粉丝点击