本文描述应用程序生命周期的摘要信息,列表了重要的生命周期事件并描述如何编写合适的处理代码。在 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 就无法接收请求。了解使用 ASP.NET 授权的应用程序是重要的。比如,.htm 文件通常不会映射到 ASP.NET,ASP.NET 也不对 .html 文件的请求进行验证或处理。因此,即使对于只包含静态内容的文件,允许将扩展名改成映射成 ASP.NET 处理类型的 .aspx 来要求 ASP.NET 进行处理。 注意:如果为拥有特殊扩展名的文件创建了自定义处理器,则需要将该扩展名映射到 IIS 中的 ASP.NET 扩展并在应用程序 Web.config 文件中注册自定义处理器。 |
ASP.NET 接收应用程序的第一个请求。 | 当 ASP.NET 接收到应用程序的第一个资源请求时,名为 相关内容如图所示:
ASP.NET 会编译应用程序中被请求的最顶层项目,包括 App_Code 目录中的应用程序代码。 |
ASP.NET 为每个请求都创建核心处理对象。 | 在创建应用程序域空间并实例化 |
为请求指派 | 应用程序所有核心对象都初始化完成之后,应用程序就开始创建 注意:第一次请求或处理页面时,会创建新的 在创建 相关内容如图所示:
|
请求 | 下列事件在处理请求时由
PostMapRequestHandler 事件。 引发 AcquireRequestState 事件。 引发 PostAcquireRequestState 事件。 引发 PreRequestHandlerExecute 事件。 使用合适的 IHttpHandler 对象为请求调用 ProcessRequest 方法(或异步版本的 BeginProcessRequest 方法)。比如,页面请求则由当前页面的实例进行处理。 引发 PostRequestHandlerExecute 事件。 引发 ReleaseRequestState 事件。 引发 PostReleaseRequestState 事件。 如果定义了 Filter 属性则对回应内容进行过滤。 引发 UpdateRequestCache 事件。 引发 PostUpdateRequestCache 事件。 引发 EndRequest 事件。 |
生命周期事件和 Global.asax 文件
应用程序生命周期中引发的所有事件可由开发者通过特定方法的重载进行处理。这需要在应用程序根目录创建 Global.asax 文件。
创建 Global.asax 文件后,ASP.NET 会将它编译进 HttpApplication
的继承类,并使用这个类重载应用程序。
HttpApplication
实例的进程每次只处理一个请求。因此,访问应用程序的非静态成员不再需要锁定与解锁,简化了应用程序事件处理过程。但仍然可以把具体数据存储在应用程序的非静态成员中。比如,在 Global.asax 文件中自定义属性并赋值。
ASP.NET 自动将应用程序事件绑定到 Global.asax 文件的处理过程,处理过程通常以“Application_事件”的格式命名(如 Application_BeginRequest
)。这与 ASP.NET 页面方法自动与页面事件(如 Page_Load
)绑定类似。
HttpApplication
对象的 Application_Start
和 Application_End
方法属于不允许重载的特殊方法。
下表列出应用程序生命周期内使用的各种事件和函数。实际上还有更多内容未被列出,因为通常情况下并不需要使用。
事件或方法 | 描述 |
---|---|
Application_Start | 第一次请求 ASP.NET 应用程序资源时被调用。 应用程序启动时只允许设置静态数据。注意不要为任何实例化数据赋值,因为它们仅在第一个被创建的 |
Application_事件 | 在应用程序生命周期内的合适时间被引发,跟本文前面部分应用程序生命周期表里列出的情况一样。 |
| 当所有模块创建完成后,分别由 |
| 在销毁应用程序实例时被调用。用于手动释放非托管资源。 |
| 每个应用程序实例被释放之前被调用,且只能调用一次。 |
HTTP 模块
ASP.NET 应用程序生命周期可以通过 IHttpModule
接口进行扩展。ASP.NET 包括若干实现 IHttpModule
接口的类,如 SessionStateModule
等等。也可以用 IHttpModule
接口实现自定义类。
在应用程序中添加模块后,模块本身也能够引发事件。应用程序能够在 Global.asax 文件中预订这些事件,通常使用“模块名_事件名”格式命名。比如,创建名为 FormsAuthentication_Authenticate
的处理器来处理由 FormsAuthenticationModule
对象引发的 Authenticate
事件。
ASP.NET 默认时启用 SessionStateModule
类。所有会话事件都自动以“Session_事件”格式命名(如 Session_Start
)。每创建一个新的会话对象都会引发 Session
的 Start
事件。