• 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 元素而言,方法的顺序极其重要。

  • 相关阅读:
    VS2010/MFC编程入门之四(MFC应用程序框架分析)
    VS2010/MFC编程入门之三(VS2010应用程序工程中文件的组成结构)
    shell脚本学习一
    docker安装rabbitmq
    docker安装activemq
    docker搭建数据库主从复制
    在docker容器中安装vim命令进行编辑文件
    docker的常用操作
    docker上安装eslaticsearch
    centos7上面关闭防火墙
  • 原文地址:https://www.cnblogs.com/silva/p/1452795.html
Copyright © 2020-2023  润新知