ASP.NET 1.1 & 2.0 页面对象模型

对来自浏览器的 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 接收到应用程序的第一个资源请求时,名为 ApplicationManager 的类对象会创建应用程序域空间(1)。应用程序域空间为应用程序提供独立的全局变量,允许任何一个应用程序自由销毁。应用程序域空间会创建 HostingEnvironment 实例,提供应用程序相关信息(如存储应用程序的目录名)的访问。

相关内容如图所示:

应用程序运行方式

ASP.NET 会编译应用程序中被请求的最顶层项目,包括 App_Code 目录中的应用程序代码。

ASP.NET 为每个请求都创建核心处理对象。

在创建应用程序域空间并实例化 HostingEnvironment 对象之后,ASP.NET 会创建并初始化核心处理对象(如 HttpContextHttpRequest,以及 HttpResponse)。HttpContext 类包含指派给当前应用请求的相关对象,如 HttpRequestHttpResponseHttpRequest 对象包含当前请求的相关信息,包括 Cookies 和浏览器信息。HttpResponse 对象包含发送到客户端的回应内容,包括所有被呈现的输出内容和 Cookies。

为请求指派 HttpApplication 对象。

应用程序所有核心对象都初始化完成之后,应用程序就开始创建 HttpApplication 实例(2)。如果应用程序使用了 Global.asax 文件,ASP.NET 还会为 Global.asax 创建 HttpApplication 的派生实例,并替代默认实例来重载应用程序。

注意:第一次请求或处理页面时,会创建新的 HttpApplication 实例。但在需要性能最大化的时候,HttpApplication 实例可以在多个请求中重复使用。

在创建 HttpApplication 实例时会创建所有已配置模块。应用程序配置为实例后,ASP.NET 会创建 SessionStateModule 模型。在所有已配置模块创建完毕后会调用 HttpApplicationInit 方法。

相关内容如图所示:

应用程序组成环境

请求 HttpApplication 的管道处理。

下列事件在处理请求时由 HttpApplication 执行。开发者在扩展 HttpApplication 时应该注意对这些事件的处理。

  1. 对请求的内容进行验证,分析由浏览器发送的信息并检测是否含有潜在的不安全标记。
  2. 完成 URL 映射,映射 Web.config 文件 UrlMappingsSection 元素中所有已配置 URL 映射。
  3. 引发 BeginRequest 事件。
  4. 引发 AuthenticateRequest 事件。
  5. 引发 PostAuthenticateRequest 事件。
  6. 引发 AuthorizeRequest 事件。
  7. 引发 PostAuthorizeRequest 事件。
  8. 引发 ResolveRequestCache 事件。
  9. 引发 PostResolveRequestCache 事件。
  10. 实现了 IHttpHandler 接口的自定义类处理具有特定扩展名的资源(必须经过应用程序的配置文件进行映射),ASP.NET 会在创建 Page 派生实例之前对其进行编译。
  11. 引发 PostMapRequestHandler 事件

    处理特别情况,(配置文件中进行定义的具有特定扩展名的资源),我们使用实现了IHttpHandler接口的类;而对于普遍情况,我们使用实现了IHttpModule的类来处理(3)。

  12. 引发 AcquireRequestState 事件。
  13. 引发 PostAcquireRequestState 事件。
  14. 引发 PreRequestHandlerExecute 事件。
  15. 使用合适的 IHttpHandler 对象为请求调用 ProcessRequest 方法(或异步版本的 BeginProcessRequest 方法)。比如,页面请求则由当前页面的实例进行处理。
  16. 引发 PostRequestHandlerExecute 事件。
  17. 引发 ReleaseRequestState 事件。
  18. 引发 PostReleaseRequestState 事件。
  19. 如果定义了 Filter 属性则对回应内容进行过滤。
  20. 引发 UpdateRequestCache 事件。
  21. 引发 PostUpdateRequestCache 事件。
  22. 引发 EndRequest 事件。


 接着,对于实现了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 元素而言,方法的顺序极其重要。

原文地址:https://www.cnblogs.com/silva/p/1452795.html