IIS 7.0 的 ASP.NET 应用程序生命周期


      ASP.NET 应用程序的生命周期以浏览器向 Web 服务器发送请求为起点。 有关IIS的工作原理,博客园里比较经典的文章:http://www.cnblogs.com/szhy222/archive/2008/07/14/1242576.html。IIS 7.0 集成模式下的请求会经历几个阶段,类似于在 IIS 6.0 中对 ASP.NET 资源的请求所经历的阶段。但是,在 IIS 7.0 中,这些阶段包含多个额外的应用程序事件,如 MapRequestHandlerLogRequestPostLogRequest 事件。

      IIS 7.0 和 IIS 6.0 的处理阶段之间的主要区别在于 ASP.NET 如何与 IIS 服务器集成。在 IIS 6.0 中,有两个请求处理管道。一个管道用于本机代码 ISAPI 筛选器和扩展组件。另一个管道用于托管代码应用程序组件,如 ASP.NET。在 IIS 7.0 中,ASP.NET 运行库与 Web 服务器集成,这样就有了一个针对所有请求的统一的请求处理管道。


在 IIS 7.0 集成模式下运行的 ASP.NET 应用程序生命周期的各个阶段

              发出一个对应用程序的请求

  •       ASP.NET应用程序的生命周期以浏览器向Web服务器发送请求为起点。 在 IIS 7.0 经典模式下以及在 IIS 6.0 中,ASP.NET 请求管道与 Web 服务器管道分离。模块仅应用于路由到 ASP.NET ISAPI 扩展的请求。如果请求的资源类型的文件扩展名未显式映射到 ASP.NET,则不会为该请求调用 ASP.NET 功能,因为 ASP.NET 运行库没有处理该请求。

          而在 IIS 7.0 集成模式下,由一个统一的管道处理所有请求。当集成管道收到请求时,该请求将经历所有请求共有的一些阶段。这些阶段由 RequestNotification 枚举表示。所有请求都可以配置为使用 ASP.NET 功能,因为该功能封装在可以访问请求管道的托管代码模块中。例如,即使 .htm 文件扩展名未显式映射到 ASP.NET,对 HTML 页的请求仍会调用 ASP.NET 模块。这使我们能对所有资源使用 ASP.NET 身份验证和授权。

          统一管道接收对应用程序的第一个请求
  •       

          当统一管道接收对应用程序中的任何资源的第一个请求时,将为 ApplicationManager 类创建一个实例,该实例就是处理请求的应用程序域。应用程序域提供了应用程序之间全局变量的分离,并且使每个应用程序能够单独卸载。在应用程序域中,将为 HostingEnvironment 类创建一个实例,该实例提供对有关应用程序的信息(如存储该应用程序的文件夹的名称)的访问。

          在第一个请求期间,如果需要,将对应用程序中的顶级项进行编译,其中包括 App_Code 文件夹中的应用程序代码(可在 App_Code 文件夹中包含自定义模块和处理程序)。


          为每个请求创建响应对象
  •       

          在创建了应用程序域并对 HostingEnvironment 对象进行了实例化之后,将创建并初始化应用程序对象,如 HttpContextHttpRequestHttpResponseHttpContext 类包含特定于当前应用程序请求的对象,如 HttpRequestHttpResponse 对象。HttpRequest 对象包含有关当前请求的信息,包括 Cookie 和浏览器信息。HttpResponse 对象包含发送到客户端的响应,其中包括所有呈现的输出和 Cookie。


          将HttpApplication对象分配给请求
  •       初始化所有应用程序对象之后,将通过创建 HttpApplication 类的实例来启动应用程序。如果应用程序有 Global.asax 文件,则 ASP.NET 会创建从 HttpApplication 类派生的 Global.aspx 类的实例。然后使用该派生类来表示应用程序。 

              第一次在应用程序中请求 ASP.NET 页或进程时,将创建 HttpApplication 类的一个新实例。不过,为了尽可能提高性能,可对多个请求重复使用 HttpApplication 实例。

   
      由HttpApplication管线处理请求

  •       在处理请求时,HttpApplication 类会执行下列任务。
    1. 对请求进行验证,将检查浏览器发送的信息,并确定其是否包含潜在恶意标记。

    2. 如果已在 Web.config 文件的 UrlMappingsSection 节中配置了任何 URL,则执行 URL 映射。

    3. 引发 BeginRequest 事件。

    4. 引发 AuthenticateRequest 事件。

    5. 引发 PostAuthenticateRequest 事件。

    6. 引发 AuthorizeRequest 事件。

    7. 引发 PostAuthorizeRequest 事件。

    8. 引发 ResolveRequestCache 事件。

    9. 引发 PostResolveRequestCache 事件。

    10. 引发 MapRequestHandler 事件。将根据所请求资源的文件扩展名,选择相应的处理程序。处理程序可以是本机代码模块,如 IIS 7.0 StaticFileModule,也可以是托管代码模块,如 PageHandlerFactory 类(它处理 .aspx 文件)。

    11. 引发 PostMapRequestHandler 事件。

    12. 引发 AcquireRequestState 事件。

    13. 引发 PostAcquireRequestState 事件。

    14. 引发 PreRequestHandlerExecute 事件。

    15. 为该请求调用合适的 IHttpHandler 类的 ProcessRequest 方法(或异步版 IHttpAsyncHandler.BeginProcessRequest)。例如,如果该请求针对某页,则当前的页实例将处理该请求。

    16. 引发 PostRequestHandlerExecute 事件。

    17. 引发 ReleaseRequestState 事件。

    18. 引发 PostReleaseRequestState 事件。

    19. 如果定义了 Filter 属性,则执行响应筛选。

    20. 引发 UpdateRequestCache 事件。

    21. 引发 PostUpdateRequestCache 事件。

    22. 引发 LogRequest 事件。

    23. 引发 PostLogRequest 事件。

    24. 引发 EndRequest 事件。

    25. 引发 PreSendRequestHeaders 事件。

    26. 引发 PreSendRequestContent 事件。

posted @ 2009-07-30 10:07  Qubook  阅读(364)  评论(0编辑  收藏  举报