ASP.NET页面的生命周期与运行机制

ASP.NET页面的生命周期与运行机制  ,这是面试题中的出现率很高的题目,做个备忘,方便自己随时查看。

 (转)

   I.页面的生命周期

ASP.NET的页面生命周期是一个基础问题,这道题目主要考察了应聘者是否真正了解ASP.NET的运行以及ASP.NET页面生命周期的原理,以下将详解这方面的知识。

【出现频率】★★★★★

【关键考点】

Page_Init

LoadViewState

LoadPostData

Page_Load

RaisePostDataChanged

RaisePostBackEvent

Page_PreRender

SaveViewState

Page_Render

UnLoad

【考题分析】

在学习ASP.NET页面生命周期前,需要先了解上一小节介绍的 ASP.NET的基本运行机制,在理解ASP.NET的基本运行机制原理后,笔者将介绍ASP.NET的页面生命周期中,页面从创建到处理结束的过程中ASP.NET Engine执行的10个事件。

(1)对象初始化

页面自身以及页面中的控件,都是在Form中被首次初始化的,初始化事件可以通过OnInit方法重载。通过在ASPX页面的后台代码文件的构造器中声明对象,页面将知道对象的类型,并知道需要创建多少个这样的对象。一旦在构造器中声明了控件,就可以在其任何子类、事件、方法或属性中访问到它们。但是,如果对象是在ASPX文件中指定的控件,由于这样的控件是没有属性的,并且这样做对从代码中访问它们是危险的,所以无法保证这些控件实例是按照怎样的顺序被创建的。

(2)加载视图状态数据

初始化以后,因为还没有建立用于相对引用的文档对象模型,所以控件仅能通过ID引用。在LoadViewState事件中,已初始化的控件获得第一个属性,即上一次提交存留到服务器的视图状态信息。页视图状态通过ASP.NET维护,通常被用于在一个往返行程中存留信息到服务器。视图状态信息以一个名称/值对的形式进行保存,它包含控件的Text和Value这一类信息。视图信息在页请求中进行传递,通常保存在隐藏<input>控件的值属性中。这个事件可以通过LoadViewState方法重载,往往用来在控件被填充时定制它所接受的数据。

(3)LoadPostData处理回传数据

在创建页的阶段,被发送到服务器端的Form数据(也称为回传数据)依照每个控件的数据需求进行处理。当页面提交Form时,框架将在每个提交数据的控件上实现IPostBackDataHandler接口。随后,页面激发LoadPostData事件,通过页面解析发现实现了IPostBackDataHandler 接口的控件,并用正确的回传数据更新控件状态。ASP.NET更新正确的控件是通过匹配控件的唯一标示符来实现的,该标示符具有名称值集合中的名称值对。

注意:在所有特定的页中,每个控件都需要一个唯一标示符。框架来完成其他的步骤,以确定每个标示符在环境中是唯一的。例如,存在于单页面中的自定义用户控件。LoadPostData事件被激发后,RaisePostDataChanged事件就可以随时被执行了。

(4)对象加载

大部分的工作都是在这一阶段完成的。对象在Load事件中获得正确的Form,Load 事件能够通过调用OnLoad来重载。首先,所有的对象都被组织在页DOM(也称为控件树)中,并且很容易通过代码或者相对位置(crawling the DOM)来引用。然后对象就可以自由地访问HTML中的客户端属性集,例如width、value,或者visibility。加载时,控件逻辑,如算法、以编程方式设置控件属性、用StringBuilder装配输出字符串都同时被执行。

(5)激发RaisePostDataChanged事件

如前所述,这发生在所有实现了IPostBackDataHandler接口的控件被正确的回传数据更新以后。在这个过程中,每个控件都有一个布尔值的标识,标识其自上一次提交后该控件的数据是否被更改。然后ASP.NET通过搜索页来寻找任何显示控件数据被更改的标识,并激发 RaisePostDataChanged事件。

注意:这个事件直到Load事件发生后,所有控件被更新后才激发。这个机制可以保证在控件被回传数据更新前,其他控件的数据在RaisePostDataChanged事件中没有被手动更改过。

(6)处理客户端回传事件

当回传更新导致数据改变而引发服务器端事件后,引发回传的对象会在RaisePostBackEvent事件中被处理。这种激发回传的对象往往是其状态改变而引发回传的控件(其autopostback被启用)或者是一个被单击的窗体提交按钮。很多代码都在这个事件中执行,因为这是控制事件驱动逻辑的理想位置。为了保证呈现到浏览器中数据的正确性,在一系列的回传事件后,RaisePostBackEvent事件最终被激发。基于一致性的考虑,回传中改变的控件直到这个函数被执行后才被更新。也就是说,被预期事件改变的数据总是在结果页反映出来。RaisePostBackEvent事件也可以通过RaisePostBackEvent来捕捉。

(7)对象预呈现

对象被预呈现的地方,对于那些能够保存到视图或者维持其视图状态的对象来说,是最后一次有机会改变的地方。这使得预呈现步骤成为做最后修改的理想位置,例如,改变控件属性或改变控件树结构,则不用担心因为数据库请求或者视图状态更新而导致对象的变化。预呈现阶段之后,对象改变被锁定,并且不能再被保存到页视图状态中。预呈现阶段可以通过重载OnPreRender实现。

(8)保存视图状态

只有在所有的页面对象的改变都发生后视图状态才被保存。对象状态数据被保存在隐藏<input>对象中,这也是对象状态数据准备呈现到HTML的地方。在SaveViewState事件中,值能够被保存到视图状态对象中,但页面控件的改变并不能保存到其中。可以通过重载SaveViewState实现这个步骤。

(9)呈现HTML

页的创建是通过Render事件装配用于浏览器输出的HTML来进行的,Render事件可以被重载。在Render事件中,页调用对象使它们呈现为HTML,然后页收集HTML来进行发送。当Render事件被重载的时候,程序员可以为浏览器创建定制的HTML,此时页面创建的任何HTML都还没有生效。Render 方法用HtmlTextWriter对象作参数,并由它产生HTML给浏览器。这里仍然可以作修改,但是这样的修改只会反映到客户,也就是说,改变只会在HTML呈现中反映,而视图状态并无法被改变。

(10)释放

当呈现页面的HTML后,对象将被释放。在Dispose事件中,程序员可以清除任何在页面创建中构造的对象或者引用。在这里,所有的处理都已经被执行,程序员可以安全地释放任何还存在的对象,包括Page对象。

【答案】

在ASP.NET的页面生命周期中需要经历Page_Init、LoadViewState、LoadPostData、Page_Load、RaisePostDataChanged、RaisePostBackEvent、Page_PreRender、SaveViewState、Page_Render、UnLoad这十个事件。每次ASP.NET页面请,都经历着同样的过程:从初始化对象到销毁对象。通过了解ASP.NET页面的页面生命周期,程序员可以在编写、调试代码的时候会更好地把握这些事件之间的关系。

   II.页面的生命周期

这道题目主要考察了应聘者是否真正了解ASP.NET的运行机制以及原理原理,本小节将介绍这方面的知识。

 

【出现频率】★★★★★

 

【关键考点】

HttpHandler

HttpModuls

【考题分析】

在深入学习ASP.NET之前,首先需要先了解一下ASP.NET的基本运行机制。请参考图2.1所示:

 

图2.1  ASP.NET的运行机制

(1)当第一次访问页面时,页面请求首先依次经过HttpModuls和HttpHandler的处理,服务器接收到HttpHandler的请求后将跳转到需要访问的页面,然后ASP.NET Engine负责找到这个页面后台的类,并实例化为一个临时对象,在此过程中会触发一系列的事件,其中一部分事件需要经过对象中的方法进行处理,之后服务器会将这个处理后页面移交给Response对象,然后由Response对象将这个页面发送到客户端。这就是第一条路线。

(2)因为服务器之间的会话已经建立,在服务器中的临时对象已经建立,所以在这个页面上重新提交一些信息并再次向服务器发送请求时,是不用再经过初始化页面这一部分工作的。故这第二条路线是依次提交HttpModuls、HttpHandler请求,然后直接与临时对象交互并返回的。

(3)第三条路线与第二条路线的不同之处在于,在处理请求时,如果涉及到需要调用ASP.NET Cache(既ASP.NET缓存),临时对象将直接从ASP.NET缓存提取信息并返回。

(4)第四条路线是在刷新页面的时候,服务器接收到并发现这个请求先前曾经处理过,并将处理结果存储到由一个默认的HttpModule管理的输出缓存中,那么此时就可以直接从这个缓存中提取信息并返回,而无需再重新处理一遍。

 

【答案】

当每次请求ASP.NET页面时,依据不同的情况浏览器、服务器、ASP.NET引擎之间将执行这四条路线中的一条路线,通过了解ASP.NET页面的内部运行机制,程序员可以在编写、调试代码的时候会更加游刃有余的。

Written by

说点什么

欢迎讨论

avatar

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

  Subscribe  
提醒