IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述
http://msdn.microsoft.com/zh-cn/library/ms178473(v=VS.100).aspx在 ASP.NET 中,若要对 ASP.NET 应用程序进行初始化并使它处理请求,必须执行一些处理步骤。 此外,ASP.NET 只是对浏览器发出的请求进行处理的 Web 服务器结构的一部分。 了解应用程序生命周期非常重要,这样才能在适当的生命周期阶段编写代码,达到预期的效果。
下表描述了 ASP.NET 应用程序生命周期的各个阶段。
用户从 Web 服务器请求应用程序资源。
ASP.NET 应用程序的生命周期以浏览器向 Web 服务器(对于 ASP.NET 应用程序,通常为 IIS)发送请求为起点。 ASP.NET 是 Web 服务器下的 ISAPI 扩展。 Web 服务器接收到请求时,会对所请求的文件的文件扩展名进行检查,确定应由哪个 ISAPI 扩展处理该请求,然后将该请求传递给合适的 ISAPI 扩展。 ASP.NET 处理已映射到其上的文件扩展名,如 .aspx、.ascx、.ashx 和 .asmx。
ASP.NET 接收对应用程序的第一个请求。
当 ASP.NET 接收到对应用程序中任何资源的第一个请求时,名为 ApplicationManager的类会创建一个应用程序域。 应用程序域为全局变量提供应用程序隔离,并允许单独卸载每个应用程序。 在应用程序域中,将为名为 HostingEnvironment的类创建一个实例,该实例提供对有关应用程序的信息(如存储该应用程序的文件夹的名称)的访问。
http://cnn237111.blog.运维网.com/attachment/201106/18/2359144_13084029166oZb.png
如果需要,ASP.NET 还可对应用程序中的顶级项进行编译,其中包括 App_Code 文件夹中的应用程序代码。 有关更多信息,请参见本主题后面的“编译生命周期”。
为每个请求创建 ASP.NET 核心对象。
创建了应用程序域并对 HostingEnvironment 对象进行了实例化之后,ASP.NET 将创建并初始化核心对象,如 HttpContext、HttpRequest 和 HttpResponse。 HttpContext 类包含特定于当前应用程序请求的对象,如 HttpRequest 和 HttpResponse 对象。 HttpRequest 对象包含有关当前请求的信息,包括 Cookie 和浏览器信息。 HttpResponse 对象包含发送到客户端的响应,包括所有呈现的输出和 Cookie。
将 HttpApplication对象分配给请求
初始化所有核心应用程序对象之后,将通过创建 HttpApplication 类的实例启动应用程序。 如果应用程序具有 Global.asax 文件,则 ASP.NET 会创建 Global.asax 类(从 HttpApplication 类派生)的一个实例,并使用该派生类表示应用程序。
http://i.msdn.microsoft.com/Hash/030c41d9079671d09a62d8e2c1db6973.gif注意
第一次在应用程序中请求 ASP.NET 页或进程时,将创建 HttpApplication 的一个新实例。不过,为了尽可能提高性能,可对多个请求重复使用 HttpApplication 实例。
创建 HttpApplication 的实例时,将同时创建所有已配置的模块。 例如,如果将应用程序这样配置,ASP.NET 就会创建一个 SessionStateModule 模块。 创建了所有已配置的模块之后,将调用HttpApplication 类的 Init 方法。
下面的关系图说明了这种关系:
http://i.msdn.microsoft.com/dynimg/IC132860.gif
由 HttpApplication管线处理请求。
在处理该请求时将由 HttpApplication 类执行以下事件。 希望扩展 HttpApplication 类的开发人员尤其需要注意这些事件。
[*] 对请求进行验证,将检查浏览器发送的信息,并确定其是否包含潜在恶意标记。 有关更多信息,请参见 ValidateRequest 和脚本侵入概述。
[*] 如果已在 Web.config 文件的 UrlMappingsSection 节中配置了任何 URL,则执行 URL 映射。
[*] 引发 BeginRequest事件。
[*] 引发 AuthenticateRequest 事件。
[*] 引发 PostAuthenticateRequest 事件。
[*] 引发 AuthorizeRequest事件。
[*] 引发 PostAuthorizeRequest 事件。
[*] 引发 ResolveRequestCache事件。
[*] 引发 PostResolveRequestCache 事件。
[*] 根据所请求资源的文件扩展名(在应用程序的配置文件中映射),选择实现 IHttpHandler 的类,对请求进行处理。 如果该请求针对从 Page 类派生的对象(页),并且需要对该页进行编译,则 ASP.NET 会在创建该页的实例之前对其进行编译。
[*] 引发 PostMapRequestHandler 事件。
[*] 引发 AcquireRequestState 事件。
[*] 引发 PostAcquireRequestState 事件。
[*] 引发 PreRequestHandlerExecute 事件。
[*] 为该请求调用合适的 IHttpHandler 类的 Proce***equest 方法(或异步版 IHttpAsyncHandler.BeginProce***equest)。 例如,如果该请求针对某页,则当前的页实例将处理该请求。
[*] 引发 PostRequestHandlerExecute 事件。
[*]
引发>
[*] 引发 PostReleaseRequestState 事件。
[*] 如果定义了 Filter 属性,则执行响应筛选。
[*] 引发 UpdateRequestCache 事件。
[*] 引发 PostUpdateRequestCache 事件。
[*] 引发 EndRequest事件。
[*] 引发 PreSendRequestHeaders 事件。
[*] 引发 PreSendRequestContent 事件。
生命周期事件和 Global.asax 文件
在应用程序的生命周期期间,应用程序会引发可处理的事件并调用可重写的特定方法。 若要处理应用程序事件或方法,可以在应用程序根目录中创建一个名为 Global.asax 的文件。
如果创建了 Global.asax 文件,ASP.NET 会将其编译为从 HttpApplication 类派生的类,然后使用该派生类表示应用程序。
HttpApplication 进程的一个实例每次只处理一个请求。由于在访问应用程序类中的非静态成员时不需要将其锁定,这样可以简化应用程序的事件处理过程。 这样还可以将特定于请求的数据存储在应用程序类的非静态成员中。 例如,可以在 Global.asax 文件中定义一个属性,然后为该属性赋一个特定于请求的值。
通过使用命名约定 Application_event(如 Application_BeginRequest),ASP.NET 可在 Global.asax 文件中将应用程序事件自动绑定到处理程序。 这与将 ASP.NET 页方法自动绑定到事件(如页的 Page_Load 事件)的方法类似。
Application_Start 和 Application_End 方法是不表示 HttpApplication 事件的特殊方法。 在应用程序域的生命周期期间,ASP.NET 仅调用这些方法一次,而不是对每个 HttpApplication 实例都调用一次。
下表列出在应用程序生命周期期间使用的一些事件和方法。 实际远不止列出的这些事件,但这些事件是最常用的。
Application_Start
请求 ASP.NET 应用程序中第一个资源(如页)时调用。 在应用程序的生命周期期间仅调用一次 Application_Start 方法。 可以使用此方法执行启动任务,如将数据加载到缓存中以及初始化静态值。
在应用程序启动期间应仅设置静态数据。 由于实例数据仅可由创建的 HttpApplication 类的第一个实例使用,所以请勿设置任何实例数据。
Application_event
在应用程序生命周期中的适当时候引发,请参见本主题前面的应用程序生命周期表中列出的内容。
Application_Error 可在应用程序生命周期的任何阶段引发。
由于请求会短路,因此 Application_EndRequest 是唯一能保证每次请求时都会引发的事件。 例如,如果有两个模块处理 Application_BeginRequest 事件,第一个模块引发一个异常,则不会为第二个模块调用 Application_BeginRequest 事件。 但是,会始终调用 Application_EndRequest 方法使应用程序清理资源。
Init
在创建了所有模块之后,对 HttpApplication 类的每个实例都调用一次。
Dispose
在销毁应用程序实例之前调用。 可使用此方法手动释放任何非托管资源。 有关更多信息,请参见清理非托管资源。
Application_End
在卸载应用程序之前对每个应用程序生命周期调用一次。
HTTP Module
ASP.NET 应用程序生命周期可通过 IHttpModule 类进行扩展。 ASP.NET 包含若干实现 IHttpModule 的类,如 SessionStateModule 类。 您还可以自行创建实现 IHttpModule 的类。
如果向应用程序添加模块,模块本身会引发事件。 通过使用 modulename_eventname 约定,应用程序可以在 Global.asax 文件中预订这些事件。 例如,若要处理 FormsAuthenticationModule 对象引发的 Authenticate 事件,可以创建一个名为 FormsAuthentication_Authenticate 的处理程序。
页:
[1]