以下转自MSDN:
HttpApplication 类的实例是在 ASP.NET 基础结构中创建的,而不是由用户直接创建的。使用 HttpApplication 类的一个实例来处理其生存期中收到的众多请求。但是,它每次只能处理一个请求。这样,成员变量才可用于存储针对每个请求的数据。
应用程序引发的事件可以由实现 IHttpModule 接口的自定义模块处理,也可以由 Global.asax 文件中定义的事件处理程序代码处理。可以将实现 IHttpModule 接口的自定义模块放在 App_Code 文件夹中,也可以放在 Bin 文件夹下的某个 DLL 中。
.NET Framework 3.5 版中引入了 HttpApplication。有关更多信息,请参见
注意: |
---|
如果 IIS 7.0 在集成模式下运行,App_Code 文件夹或 Bin 文件夹中的自定义模块将应用于请求管线中的所有请求。Global.asax 文件中的事件处理程序代码则只应用于映射到某个 ASP.NET 处理程序的请求。 |
按照以下顺序引发应用程序事件:
-
BeginRequest
-
AuthenticateRequest
-
PostAuthenticateRequest
-
AuthorizeRequest
-
PostAuthorizeRequest
-
ResolveRequestCache
-
PostResolveRequestCache
在 PostResolveRequestCache 事件之后和 PostMapRequestHandler 事件之前,会创建一个事件处理程序(一个对应于请求 URL 的页)。如果服务器在集成模式下运行 IIS 7.0 并且 .NET Framework 至少为 3.0 版本,则会引发 MapRequestHandler 事件。如果服务器在经典模式下运行 IIS 7.0 或者运行的是较早版本的 IIS,则无法处理此事件。
-
PostMapRequestHandler
-
AcquireRequestState
-
PostAcquireRequestState
-
PreRequestHandlerExecute
在此事件之后执行事件处理程序。
-
PostRequestHandlerExecute
-
ReleaseRequestState
-
PostReleaseRequestState
在引发 PostReleaseRequestState 事件之后,现有的所有响应筛选器都将对输出进行筛选。
-
UpdateRequestCache
-
PostUpdateRequestCache
-
LogRequest.
仅在 IIS 7.0 处于集成模式并且 .NET Framework 至少为 3.0 版本的情况下才支持此事件。
-
PostLogRequest
仅在 IIS 7.0 处于集成模式并且 .NET Framework 至少为 3.0 版本的情况下才支持此事件。
-
EndRequest
执行顺序如图:
特别注意:
注意一个HttoModule和HttpApplication事件中的重点:
Response.End()或HttpApplication.CompleteRequest()会在HttpApplication和Module的事件链中”抄近道”.
当创建HttpModule或者在Global.asax中实现事件钩子的时候,当你调用Response.End或 Appplication.CompleteRequest的时候要特别注意.这两个函数都结束当前请求并停止触发在HTTP管道中后续的事件,然后发生将控制返回到Web服务器中.当你在处理链的后面有诸如记录日志或对内容进行操作的行为时,因为他们没有被触发,有可能使你上当.例如,如果调用Response.End()的话,EndRequest事件并不会被触发.