ASP.NET 1.1 & 2.0 页面对象模型
2009-05-08 17:31
351 查看
对来自浏览器的 ASP.NET 请求而提供服务仅是 Web 服务器架构的一小部分。
接着,对于实现了IHttpHandler接口的类,比如默认的System.Web.UI.Page,就是我们的页面了,其间的细节又会有一些关键事件。
表格 1. ASP.NET 1.1 页面生存周期中的关键事件
这一阶段的标志就是 Init 事件,在成功创建页面的控件树后,对应用程序激发这个事件。换而言之,当 Init 事件发生时,在 .aspx 源文件中静态声明的所有控件都已实例化并取其默认值。
ASP.NET 2.0 在 ASP.NET 页面的生命周期方面有两个主要的变化。首先,ASP.NET 2.0 提供了新的事件以支持新功能,这些功能包括母版页、个性化和集成的移动设备支持。其次,ASP.NET 2.0 引入了跨页发送 Web 窗体的技术。
表 1 显示了全面的方法列表。“方法”列显示了实际的事件方法名称,“活动”列指示事件是始终处于活动状态还是仅在 PostBack 操作期间处于活动状态。例如,可以使用新方法 TestDeviceFilter 来确定哪个设备筛选器可用,并使用此信息决定如何显示页面。换句话说,新方法 LoadControlState 仅在回发期间调用。可以替代此方法(与 SaveControlState 结合使用),以创建用于在回发期间保存和恢复控件状态的替换序列化方案。
表 2:ASP.NET 2.0 页面生命周期方法
通过查看页面生命周期的低级别详细信息,我们可以发现在何处能够自然地实现 ASP.NET 2.0 中的许多功能,例如主题和个性化。例如,可以在 IntializeThemes 事件中处理一个主题,在 LoadPersonalizationData 中加载个性化数据,并在以后应用于 ApplyPersonalization 方法。请注意,对于决定 Web 应用程序的最终外观的 UI 元素而言,方法的顺序极其重要。
应用程序生命周期的一般情况
下表说明了 ASP.NET 应用程序生命周期中的各种情景。情景 | 描述 |
---|---|
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 接收到应用程序的第一个资源请求时,名为 ApplicationManager的类对象会创建应用程序域空间(1)。应用程序域空间为应用程序提供独立的全局变量,允许任何一个应用程序自由销毁。应用程序域空间会创建 HostingEnvironment实例,提供应用程序相关信息(如存储应用程序的目录名)的访问。 相关内容如图所示: ASP.NET 会编译应用程序中被请求的最顶层项目,包括 App_Code 目录中的应用程序代码。 |
ASP.NET 为每个请求都创建核心处理对象。 | 在创建应用程序域空间并实例化 HostingEnvironment对象之后,ASP.NET 会创建并初始化核心处理对象(如 HttpContext, HttpRequest,以及 HttpResponse)。 HttpContext类包含指派给当前应用请求的相关对象,如 HttpRequest和 HttpResponse。 HttpRequest对象包含当前请求的相关信息,包括 Cookies 和浏览器信息。 HttpResponse对象包含发送到客户端的回应内容,包括所有被呈现的输出内容和 Cookies。 |
为请求指派 HttpApplication对象。 | 应用程序所有核心对象都初始化完成之后,应用程序就开始创建 HttpApplication实例(2)。如果应用程序使用了 Global.asax 文件,ASP.NET 还会为 Global.asax 创建 HttpApplication的派生实例,并替代默认实例来重载应用程序。 注意:第一次请求或处理页面时,会创建新的 HttpApplication实例。但在需要性能最大化的时候, HttpApplication实例可以在多个请求中重复使用。 在创建 HttpApplication实例时会创建所有已配置模块。应用程序配置为实例后,ASP.NET 会创建 SessionStateModule模型。在所有已配置模块创建完毕后会调用 HttpApplication的 Init方法。 相关内容如图所示: |
请求 HttpApplication的管道处理。 | 下列事件在处理请求时由 HttpApplication执行。开发者在扩展 HttpApplication时应该注意对这些事件的处理。 对请求的内容进行验证,分析由浏览器发送的信息并检测是否含有潜在的不安全标记。 完成 URL 映射,映射 Web.config 文件 UrlMappingsSection元素中所有已配置 URL 映射。 引发 BeginRequest事件。 引发 AuthenticateRequest事件。 引发 PostAuthenticateRequest事件。 引发 AuthorizeRequest事件。 引发 PostAuthorizeRequest事件。 引发 ResolveRequestCache事件。 引发 PostResolveRequestCache事件。 实现了 IHttpHandler接口的自定义类处理具有特定扩展名的资源(必须经过应用程序的配置文件进行映射),ASP.NET 会在创建 Page派生实例之前对其进行编译。 引发 PostMapRequestHandler事件。 处理特别情况,(配置文件中进行定义的具有特定扩展名的资源),我们使用实现了IHttpHandler接口的类;而对于普遍情况,我们使用实现了IHttpModule的类来处理(3)。 引发 AcquireRequestState事件。 引发 PostAcquireRequestState事件。 引发 PreRequestHandlerExecute事件。 使用合适的 IHttpHandler对象为请求调用 ProcessRequest方法(或异步版本的 BeginProcessRequest方法)。比如,页面请求则由当前页面的实例进行处理。 引发 PostRequestHandlerExecute事件。 引发 ReleaseRequestState事件。 引发 PostReleaseRequestState事件。 如果定义了 Filter属性则对回应内容进行过滤。 引发 UpdateRequestCache事件。 引发 PostUpdateRequestCache事件。 引发 EndRequest事件。 |
表格 1. ASP.NET 1.1 页面生存周期中的关键事件
页面事件 | 可重写方法 | |
---|---|---|
页面初始化 | Init | |
加载视图状态 | LoadViewState | |
处理回发数据 | 实现 IPostBackDataHandler 接口的任何控件中的 LoadPostData 方法 | |
加载页面 | Load | |
回发更改通知 | 实现 IPostBackDataHandler 接口的任何控件中的 RaisePostDataChangedEvent 方法 | |
处理回发事件 | 控件所定义的任何回发事件 | 实现了 IPostBackEventHandler 接口的任何控件的 RaisePostBackEvent 方法 |
页面呈现前阶段 | PreRender | |
保存视图状态 | SaveViewState | |
呈现页面 | Render | |
卸载页面 | Unload |
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 页面模型,1.1与2.0 口语篇
- ASP.NET 页面对象模型
- 漫谈ASP.NET 页面对象模型
- ASP.NET 页面对象模型
- 了解ASP.NET页面对象模型
- ASP.NET 页面对象模型
- ASP.NET 页面对象模型
- ASP.NET 页面对象模型
- ASP.NET 页面对象模型
- ASP.NET 2.0 Beta2中页面编译模型的变化(转自涂曙光博客)
- ASP.NET 页面对象模型
- asp.net 2.0页面性能的考虑--异步页面处理模型
- ASP.NET 页面对象模型
- marked ASP.NET 页面对象模型
- ASP.NET 页面对象模型
- ASP.NET 2.0 Beta2中页面编译模型的变化
- ASP.NET 页面对象模型
- ASP.NET 页面对象模型
- asp.net 2.0页面模型的最终形态分析
- ASP.NET页面对象模型:Page类介绍