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 中,这些阶段包含多个额外的应用程序事件,如 、 和 事件。
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 集成模式下,由一个统一的管道处理所有请求。当集成管道收到请求时,该请求将经历所有请求共有的一些阶段。这些阶段由 枚举表示。所有请求都可以配置为使用 ASP.NET 功能,因为该功能封装在可以访问请求管道的托管代码模块中。例如,即使 .htm 文件扩展名未显式映射到 ASP.NET,对 HTML 页的请求仍会调用 ASP.NET 模块。这使我们能对所有资源使用 ASP.NET 身份验证和授权。
统一管道接收对应用程序的第一个请求 -
当统一管道接收对应用程序中的任何资源的第一个请求时,将为 类创建一个实例,该实例就是处理请求的应用程序域。应用程序域提供了应用程序之间全局变量的分离,并且使每个应用程序能够单独卸载。在应用程序域中,将为 类创建一个实例,该实例提供对有关应用程序的信息(如存储该应用程序的文件夹的名称)的访问。
在第一个请求期间,如果需要,将对应用程序中的顶级项进行编译,其中包括 App_Code 文件夹中的应用程序代码(可在 App_Code 文件夹中包含自定义模块和处理程序)。
为每个请求创建响应对象 -
在创建了应用程序域并对 对象进行了实例化之后,将创建并初始化应用程序对象,如 、 和 。 类包含特定于当前应用程序请求的对象,如 和 对象。 对象包含有关当前请求的信息,包括 Cookie 和浏览器信息。 对象包含发送到客户端的响应,其中包括所有呈现的输出和 Cookie。
将HttpApplication对象分配给请求 - 初始化所有应用程序对象之后,将通过创建 类的实例来启动应用程序。如果应用程序有 Global.asax 文件,则 ASP.NET 会创建从 类派生的 Global.aspx 类的实例。然后使用该派生类来表示应用程序。
第一次在应用程序中请求 ASP.NET 页或进程时,将创建 类的一个新实例。不过,为了尽可能提高性能,可对多个请求重复使用 实例。
由HttpApplication管线处理请求
- 在处理请求时, 类会执行下列任务。
-
对请求进行验证,将检查浏览器发送的信息,并确定其是否包含潜在恶意标记。
-
如果已在 Web.config 文件的 节中配置了任何 URL,则执行 URL 映射。
-
引发 事件。
-
引发 事件。
-
引发 事件。
-
引发 事件。
-
引发 事件。
-
引发 事件。
-
引发 事件。
-
引发 事件。将根据所请求资源的文件扩展名,选择相应的处理程序。处理程序可以是本机代码模块,如 IIS 7.0 StaticFileModule,也可以是托管代码模块,如 类(它处理 .aspx 文件)。
-
引发 事件。
-
引发 事件。
-
引发 事件。
-
引发 事件。
-
为该请求调用合适的 类的 方法(或异步版 )。例如,如果该请求针对某页,则当前的页实例将处理该请求。
-
引发 事件。
-
引发 事件。
-
引发 事件。
-
如果定义了 属性,则执行响应筛选。
-
引发 事件。
-
引发 事件。
-
引发 事件。
-
引发 事件。
-
引发 事件。
-
引发 事件。
-
引发 事件。
-