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事件并不会被触发.