http://www.cnblogs.com/xhwy/archive/2012/05/20/2510178.htmlhtml
一.什么是Asp.Net页面生命周期面试
当咱们在浏览器地址栏中输入网址,回车查看页面时,这时会向服务器端(IIS)发送一个request请求,服务器就会判断发送过来的请求页面, 彻底识别 HTTP 页面处理程序类后,ASP.NET 运行时将调用处理程序的 ProcessRequest 方法来处理请求,来建立页面对象。一般状况下,无需更改此方法的实现,由于它是由 Page 类提供的。接下来被建立页面对象的ProcessRequest方法使页面经历了各个阶段:初始化、加载视图状态信息和回发数据、加载页面的用户代码以及执行回发服务器端事件。以后,页面进入显示模式:收集更新的视图状态,生成 HTML 代码并随后将代码发送到输出控制台。最后,卸载页面,并认为请求处理完毕。其中页面对象ProcessRequest方法 完成的这一系列事件的处理过程就是Asp.Net页面生命周期。数据库
二.了解Asp.Net页面生命周期的好处编程
了解个掌握ASP.NET页面生命周期是很是必要的,这有助于咱们更加灵活的控制页面,以咱们须要的方式编程开发。ASP.NET页运行时,此页会经历一个又一个的事件链,每一个事件链中执行不一样的行为,这全部的行为共同组成咱们所须要的页面。了解了生命周期也更有助于咱们对程序调试中发生问题的地方的定位。windows
三.详解Asp.Net页面生命周期api
(一)先看看在开始一个页面生命周期以前,请求的页面经历了那些过程。如图所示:浏览器
通讯处理过程:服务器
当服务器运行正常的状况下,客户端(浏览器)
向服务器端发送请求时,服务器端负责监听的套接字(socket),监听到有链接请求后,会为该客户端创建一个用于通讯的套接字与客户端进行通讯。当用户在浏览器向服务器发送请求时,浏览器会按照双方都约定好的网络传输层http协议,将请求转换成符合Http协议的请求报文。而后经过设备按照TCP协议发送到服务器。在服务器端接收到请求报文后。会按照Http协议对报文进行解析。若请求的内容为静态的数据,服务器端直接将被请求的数据,按照Http协议生成响应报文后返回给浏览器。浏览器而后解析收到的报文。将页面显示到浏览器窗口。(注:最开始仅是显示一个html 框架。通过屡次请求。将CSS样式,图片………逐一的加载进来造成一个完整的页面。这个过程,有屡次的交互通讯。当通讯结束后会把用来通讯的套接字销毁,由于http协议是一种无状态的通讯。这样减轻了服务器的压力)网络
当浏览器向客户端发送的请求为动态的。那么服务器(IIS)发现处理不了这种后缀名的文件时,会经过映射表到。响应实现了接口的可扩展程序asp.net_isapi.dll, 而后asp.net_isapi.dll,又将请求转交给网站程序处理.网站程序调用框架
httpRuntime类的processRequest方法来处理:
1. 此类会分析接收到的请求报文.将请求报文封装到名称为httpWorkerRequest的类的属性中(便于其它地方以用).
2. 建立HttpContext对象.这个对象是当前所请求报文的上下文环境.它包含了全部的请求数据.其中有两个最重要类的对象:http.Request和http.Response. 在httpRequest对象中又包含了两个属性.Form(经过表单请求的数据参数).Querystring(经过URL传递的数据参数); 经过索引器,能够找到参数的值. 在httpResponse 对象中有一个TextWriter对象.在它里面保存的是被请求的页面在执行过程当中要向浏览器输出的数据.能够经过write 方法对其进行输出给浏览器。
3. 经过HttpApplicationFactory类的的一个静态方法。来为每一个请求建立一个单独的httpApplication对象。在建立以前HttpApplicationFactor会到HttpApplication池中查看,有没有空闲的。如有直接用。没有的时候才建立新的HttpApplication。
4. 在httpApplication里运行己转换成接口IhttpHandler 的经过反射被请求页面对象的ProcessRequest 方法.
方法执行过程以下:先执行httpApplication中的processRequest方法。在此方法中包含了要按照前后顺序执行的19个委托事件 当在执行到第8个事件的时候就开始建立被请求页面对象,在执行到第11和第12个事件之间时。就执行被建立的请求页面对象的ProcessRequest方法。
(二)开始页面生命周期
1.页面生命周期的主要阶段包括: 阶段 事件/方法
页面初始化 Page_Init
加载View State LoadViewState
回发数据处理 LoadPostData
页面加载 Page_Load
回发通知 RaisePostDataChangedEvent
回发事件处理 RaisePostBackEvent
页面预渲染 Page_PreRender
保存 viewstate SaveViewState
Page渲染 Page_Render
Page 卸载 Page_UnLoad
2.页面生命周期的主要事件:
PreInit:
1.检查IsPostBack 属性
2.动态设置Master Page
3.动态设置Theme
4.设置控件的默认值(UniqueId等)
5.从新建立动态控件(初始化控件),初始化控件的值
Init: 这个事件发生在全部的控件被初始化,全部的皮肤设置被应用之后。它用来读取或者初始化控件属性。它可以用来注册一些aspx页面中没有指出的控件的事件。
InitComplete: Use this event for processing tasks that require all initialization to be complete.
PreLoad: 加载页面的ViewState和全部的控件,而后处理全部的包含在Request实例中的postback数据。
Load: 这个事件多是你们最熟悉的了。须要注意的是,Page对象会递归的调用子控件的onload事件直到页面和全部的子控件被加载完成。这个事件主要用来设置控件属性的值,创建数据库链接(一般不这么作)。
Validation: 若是你的控件要求验证,验证会在这个阶段发生,这个时候你能够检查控件的IsValid属性。跟这个阶段关联的事件是Validate,它有一个能够接受验证字符串群的重载方法(overload method),这个重载方法执行特定控件群的验证。
Control events: 这个就很少说了,主要是处理控件的事件,例如click。这也就让咱们明白了每次咱们click一个Button的时候,其实是要先去执行load事件而后才执行click事件的,通常咱们用!IsPostBack来判断一下从而避免执行没必要要的加载逻辑。
LoadComplete: 页面全部的控件都被加载之后执行,暂时没有想到用来干什么。。。
PreRender: 在HTML被生成以前这是最后一个事件。每个页面中的控件都有PreRender的过程。在这里对将要输出的HTML结果进行最后一次修改。
SaveStateComplete: 在这个时间发生以前,已经保存了全部控件和页面的,任何对page或者控件的改动都不会产生左右。暂时没想到用来干啥。
Render: 它不是一个事件而是一个方法。工做就是把HTML写回客户端浏览器。
UnLoad: 页面中的每个控件都会发生这件事。在控件中,使用这个事件来作清理工做,例如关闭数据库链接等。对与页面自己也是作清理工做,例如关闭打开的文件和数据库链接,或者结束日志或者其它指定的工做。
须要说明的是,每次Request都会建立一个全新的Page类的实例,因此在页面中的本身定义的字段是不能在两次request中传递值的,须要使用viewstate来存储。
页面处理的总体过程图解
四.什么地方用到了Asp.Net 页面生命周期
对于这个问题,在面试中我遇到过,我以为问这个问题有点不正常。我当时回答的是。Viewstate 对值的记录上用到了生命周期,老是觉对不太对。
生命周期理解了,并不表明咱们会用它。只有理解了,咱们才会在之后的工做中慢慢真正的懂它,用它。
总结:计划了很久,一直没有写,今天下定决心必定要写了。终于完成了。我看有一位博友的用三张图片详解Asp.Net 全生命周期还不错。用图结构清晰,更便于理解。故贴到下面便于博友们和之后本身的查看。原文地址:http://www.cnblogs.com/zhaoyang/archive/2011/11/16/2251200.html
说明:
1 第一张图片从全局说明从客户端发出一个Request请求,服务器windows内核中的HTTP.SYS组件接收该请求开始到IIS处理完该请求并响应到客户端结束。
2 第二张图片为图1中Http处理管线的详细步骤
3 第三张图片为图2Http处理管线中调用处理程序(HttpHandler, 此处为Page对象)的详细生命周期过程。
图1:
图2.
图3.