对来自浏览器的 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 事件。处理特别情况,(配置文件中进行定义的具有特定扩展名的资源),我们使用实现了IHttpHandler接口的类;而对于普遍情况,我们使用实现了IHttpModule的类来处理(3)。 |
接着,对于实现了IHttpHandler接口的类,比如默认的System.Web.UI.Page,就是我们的页面了,其间的细节又会有一些关键事件。
表格 1. ASP.NET 1.1 页面生存周期中的关键事件
阶段
页面事件 |
可重写方法 |
|
---|---|---|
页面初始化 |
Init |
|
加载视图状态 |
|
LoadViewState |
处理回发数据 |
|
实现 IPostBackDataHandler 接口的任何控件中的 LoadPostData 方法 |
加载页面 |
Load |
|
回发更改通知 |
|
实现 IPostBackDataHandler 接口的任何控件中的 RaisePostDataChangedEvent 方法 |
处理回发事件 |
控件所定义的任何回发事件 |
实现了 IPostBackEventHandler 接口的任何控件的 RaisePostBackEvent 方法 |
页面呈现前阶段 |
PreRender |
|
保存视图状态 |
|
SaveViewState |
呈现页面 |
|
Render |
卸载页面 |
Unload |
这一阶段的标志就是 Init 事件,在成功创建页面的控件树后,对应用程序激发这个事件。换而言之,当 Init 事件发生时,在 .aspx 源文件中静态声明的所有控件都已实例化并取其默认值。
ASP.NET 2.0 在 ASP.NET 页面的生命周期方面有两个主要的变化。首先,ASP.NET 2.0 提供了新的事件以支持新功能,这些功能包括母版页、个性化和集成的移动设备支持。其次,ASP.NET 2.0 引入了跨页发送 Web 窗体的技术。
新事件
与 ASP.NET 1.x 相比,ASP.NET 2.0 提供了更精确的页面生命周期方法堆栈。这些新增的方法为 Web 开发人员提供了更高级别的控制。可以通过任何 ASP.NET 页面上的“Page”对象访问这些事件。
表 1 显示了全面的方法列表。“方法”列显示了实际的事件方法名称,“活动”列指示事件是始终处于活动状态还是仅在 PostBack 操作期间处于活动状态。例如,可以使用新方法 TestDeviceFilter 来确定哪个设备筛选器可用,并使用此信息决定如何显示页面。换句话说,新方法 LoadControlState 仅在回发期间调用。可以替代此方法(与 SaveControlState 结合使用),以创建用于在回发期间保存和恢复控件状态的替换序列化方案。
表 2:ASP.NET 2.0 页面生命周期方法
方法 |
活动 |
---|---|
Constructor |
始终 |
Construct |
始终 |
TestDeviceFilter |
始终 |
AddParsedSubObject |
始终 |
DeterminePostBackMode |
始终 |
OnPreInit |
始终 |
LoadPersonalizationData |
始终 |
InitializeThemes |
始终 |
OnInit |
始终 |
ApplyControlSkin |
始终 |
ApplyPersonalization |
始终 |
OnInitComplete |
始终 |
LoadPageStateFromPersistenceMedium |
PostBack |
LoadControlState |
PostBack |
LoadViewState |
PostBack |
ProcessPostData1 |
PostBack |
OnPreLoad |
始终 |
OnLoad |
始终 |
ProcessPostData2 |
PostBack |
RaiseChangedEvents |
PostBack |
RaisePostBackEvent |
PostBack |
OnLoadComplete |
始终 |
OnPreRender |
始终 |
OnPreRenderComplete |
始终 |
SavePersonalizationData |
始终 |
SaveControlState |
始终 |
SaveViewState |
始终 |
SavePageStateToPersistenceMedium |
始终 |
Render |
始终 |
OnUnload |
始终 |
通过查看页面生命周期的低级别详细信息,我们可以发现在何处能够自然地实现 ASP.NET 2.0 中的许多功能,例如主题和个性化。例如,可以在 IntializeThemes 事件中处理一个主题,在 LoadPersonalizationData 中加载个性化数据,并在以后应用于 ApplyPersonalization 方法。请注意,对于决定 Web 应用程序的最终外观的 UI 元素而言,方法的顺序极其重要。