一、ASP.Net Web应用程序中的请求处理过程

二、 http模块生命周期:

三、Asp.NET页面生命周期

1、阶段

阶段 说明
请求页面(Page Request) 严格地说,这个阶段不是页面生命周期的一部分。而是页面生命周期之前的一个阶段。Asp.NET接收到一个页面请求之后,执行分析和编译页面的工作或者从缓存中取出该页面发送给客户端。
开始(Start) 在这个阶段,Asp.NET设置Page对象的Request和Response属性;确定该页面请求是否为PostBack;给页面设置UICulture属性。
初始化(Initialization) 页面和控件对象的初始化;为控件设置UniqueID;为页面设置Master Page和Theme;需要特别注意的是,在这个阶段,客户端提交的数据,还没有被恢复到页面控件中去,包括ViewState在内。
加载(Load) 加载ViewState; 将表单数据设置到对应控件中去。
回发事件(PostBack event) 如果当前请求是一个PostBack请求,那么必然有某个事情导致了这次PostBack, 现在就到了执行该事件在服务器上的Event Handler的时候了。         
这个阶段主要的问题在于Validation和Event Handler的执行次序。          
    1.如果该Event本身没有直接导致Validation, 比如我在Button上设置了不需要Validation,那么该Button的Click Event Handler先执行,然后页面上会执行页面上所有Validator 控件的Validator方法,然后设置页面的IsValid属性。          
    2.如果该Event本身直接导致了Validation,比如用户点击了一个Button,这个Button默认就会导致Validator被调用。这时候,Validation的执行是在Button的Click Event Handler之前的。等你进入Button的Click Event Handler的时候,页面的IsValid属性已经设置好了。
渲染(Rendering) Asp.NET将页面和所有控件的ViewState保存到Form表单中去。然后调用所有控件和页面的Render方法来输出Html.
卸载(Unload) 执行到这个阶段的时候,页面已经将Html输出到客户端了。这个阶段要做的事情就包括:卸载Request对象和Response对象,执行一些清理工作。
下面将页面生命周期与服务器控件生命周期在一张图上(从MSDN中复制)综合展示:

2、页面中事件/阶段的执行模式:

事件&方法 Page ONLY Control ONLY 顶层到底层 顶层到顶层
PreInit YES   —— 
Init 事件   YES
InitComplete YES   ——
LoadViewState 方法 YES  
ProcessPostData 方法 YES  
PreLoad YES   ——
Load 事件 YES  
PostBack Event   YES ——
LoadComplete YES   ——
PreRender 事件 YES  
DataBinding Event   YES ——
PreRenderComplete YES   ——
SaveViewState 方法 YES  
SaveStateComplete YES   ——
Render 方法   YES
Unload 事件   YES

3、示例程序

public partial class _Default : System.Web.UI.Page
{
protected int i = 1; protected void Page_PreInit(object sender, EventArgs e)
{
Response.Write(i + ".PreInit:当页面初始化开始时发生");
i++;
Response.Write("<br>");
} protected void Page_Init(object sender, EventArgs e)
{
Response.Write(i + ".Init:当服务器空间初始化时发生");
i++;
Response.Write("<br>");
} protected void Page_InitComplete(object sender, EventArgs e)
{
Response.Write(i + ".InitComplete:当页初始化完成时发生");
i++;
Response.Write("<br>");
} protected void Page_PreLoad(object sender, EventArgs e)
{
Response.Write(i + ".PreLoad:当页load事件前发生");
i++;
Response.Write("<br>");
} protected void Page_Load(object sender, EventArgs e)
{
Response.Write(i + ".Load:当服务器控件加载到Page对象中时发生(加载页面时)");
i++;
Response.Write("<br>"); //在Load和LoadComplete之间会执行控件事件.
//如 Button 控件的 Click 事件或 TextBox 控件的 TextChanged 事件。
} protected void Page_LoadComplete(object sender, EventArgs e)
{
Response.Write(i + ".LoadComplete:当页面生命周期的加载阶段结束时发生");
i++;
Response.Write("<br>");
} protected void Page_PreRender(object sender, EventArgs e)
{
Response.Write(i + ".PreRender:当页加载控件之后,呈现之前发生,使用该事件对页或其控件的内容进行最后更改(预呈现)");
i++;
Response.Write("<br>");
} protected void Page_PreRenderComplete(object sender, EventArgs e)
{
Response.Write(i + ".PreRenderComplete:呈现内容前发生.(预呈现完成)");
i++;
Response.Write("<br>");
} protected void Page_SaveStateComplete(object sender, EventArgs e)
{
/*网页上控件的状态信息是在 PreRenderComplete 事件后保存的。
在SaveStateComplete事件之前用Trace查看页时其实在该事件前还有
一个SaveState事件,只是这里无法演示. 注意:SaveStateComplete 事件在将页和页上控件的视图状态和控件状态保存到持久性介质之后引发。
这是在页被呈现到请求浏览器之前引发的最后一个事件。*/ Response.Write(i + ".SaveStateComplete:在页已完成对页和页上控件的所有视图状态和控件状态信息的保存后发生.");
i++;
Response.Write("<br>"); /*最后一部操作
呈现:Render:
它不是事件;在处理的这个阶段,Page 对象会在每个控件上调用此方法Render()。
所有 ASP.NET Web 服务器控件都有一个用于写出发送给浏览器的控件标记的 Render 方法。*/ /*当你关闭页面的时候就会引发UnLoad(当服务器控件从内存中卸载时发生)
和Disposed两事件(当从内存释放服务器控件时发生,这是服务器控件生存期的最后阶段) 首先加载UnLoad事件:卸载页面:完全呈现页、将页发送至客户端并准备丢弃时,
将调用卸载。此时,将卸载页属性(如Response和Request)并执行清理. 最后加载Disposed事件,释放资源,生命周期结束....
*/
} }

结果显示:

四、PageLoad 与 OnLoad区别:

1、用VS.Net生成的页面中的Page_Load方法(事件处理程序)就是响应Page.Load事件的。对于每一次请求,Load事件都会触发,Page_Load方法就会执行。

2、@Page指令中的AutoEventWireup=true时,页面会与某些特殊的事件方法绑定,自动识别这些具有特定名称的事件。这些特定名称包括:Page_Init, Page_Load, Page_DataBind, Page_PreRender和Page_Unload等。asp.net不需要显示的来绑定事件处理程序,它会在运行时自动的根据他们的方法名和签名绑定事件,对每一个事件,ASP.NET会根据Page_eventname这种模式去搜寻方法,如果没有找到带此签名的事件处理程序,则 ASP.NET 将检查没有参数的重载。

当时AutoEventWireup=false的时候,则必须显示绑定事件方法,比如,你有一个Page_Load方法,只有当你这样写代码的时候,才会触发事件方法:Page.Load += Page_Load;在这种情况下,方法名称不必遵循某一模式。

3、Page.Load事件是在System.Web.UI.Control类中定义的(此类是Page和所有服务器控件的基类),是在OnLoad方法中触发Page.Load事件。

因此如果在Page页面里重写了OnLoad方法,则此时虽然是用的AutoEventWireup=true,但Page_Load方法也不会被执行。如果比较考虑性能,建议用override Oneventname方法的方式来实现页面的事件加载。

public partial class Default : Page
{
protected void Page_Load(object sender, EventArgs e)
{
Response.Write("2");
} protected override void OnLoad(EventArgs e)
{
Response.Write("1");
base.OnLoad(e);
Response.Write("3");
}
}

输出123。首先由于override父类的OnLoad,所以先执行页面的OnLoad方法,输出1,然后执行父类的OnLoad方法,一直上推到执行完Control类的OnLoad方法后,执行Load事件的委托链方法,执行Page_Load方法,输出2。最后回到

页面的OnLoad方法输出3。如果AutoEventWireup=false,则Page_Load不执行。

五、总结:三张图片详解Asp.Net 全生命周期还不错。

1、  第一张图片从全局说明从客户端发出一个Request请求,服务器windows内核中的HTTP.SYS组件接收该请求开始到IIS处理完该请求并响应到客户端结束。

2、  第二张图片为图1中Http处理管线的详细步骤

3、  第三张图片为图2Http处理管线中调用处理程序(HttpHandler,  此处为Page对象)的详细生命周期过程。

ASP.Net页面生存周期、Page_Load方法的更多相关文章

  1. ASP.NET页面生存周期

    .Net的Page请求过程:

  2. Asp.net页面生存周期【转】

    ASP.NET 页面生存周期中的关键事件 要想深入ASP.NET页面编程,就必须了解页面生存周期各个阶段及相关事件.重写相关事件和方法可以使我们更好的控制页面呈现. # 事件或方法 功能 描述 1 I ...

  3. Asp.net 页面传值的方法

    ASP.NET页面传值的方法 From:Refresh-air 在面试的时候,经常会遇到这样的问题,其实我们会对其中的几种方法比较熟悉,因为项目中经常使用.但是要全面的回答ASP.NET中页面传值的方 ...

  4. ASP.NET页面传值的方法

    ASP.NET页面传值的方法 From:Refresh-air 在面试的时候,经常会遇到这样的问题,其实我们会对其中的几种方法比较熟悉,因为项目中经常使用.但是要全面的回答ASP.NET中页面传值的方 ...

  5. asp.net页面之间传值方法详解

    asp.net中页面之间传值我们用得最多的就是get,post这两种了,其它的如session,appliction,cookie等这些相对来说少用也不是常用的,只是在特殊情况下在使用了. 1. Ge ...

  6. 最简单的ASP动态页面生成伪静态方法

    目前网站制作中很多网站都采用生成静态页的方法,原因是这样访问速度会得到提高(服务器端CPU利用率很低),另外也容易被搜索引擎收录,但是这带来的一个问题就是需要足够大的空间存放这些静态页面,如果你的空间 ...

  7. Asp.Net页面传值的方法简单总结【原创】

    1.QueryString 当页面上form按照get的方式向页面发送请求数据的时候,web server会将请求数据放入 一个QEURY_STRING的环境变量中,然后通过QeueryString方 ...

  8. asp.net页面与页面之间传参数值

    一.利用POST传值 传值asp文件send.aspx  代码如下 复制代码 <form id="form1" runat="server" action ...

  9. 封装WebService的APM为Async、Await模式利于Asp.Net页面调用

    Wcf针对Async.Await指令直接可以返回Task<T>结果,但是老旧的系统中还是会有很多是在用Soap的Webservice.直接在Asp.Net页面调用APM方法确实比较麻烦,其 ...

随机推荐

  1. python数据结构_递归_汉诺塔问题

    已经不是第一次写这个汉诺塔问题, 其实递归还真是不太好理解, 因为递归这种是想其实有点反人类, 为什么? 因为不太清楚, 写个循环一目了然, 用递归其实要把核心逻辑理清楚, 要不根本没法进行下去 所有 ...

  2. JavaScript form提交汉字乱码

    <script type="text/javascript"> var test1="http://www.w3school.com.cn/My first/ ...

  3. windows批量导出文件名到txt

    做图像处理时,经常会遇到训练数据样本,这个时候一般就会要一个保存了大量文件名txt文件作为数据的输入 windows系统中可以直接使用dir,具体使用可以直接打开windows的终端 输入 dir/? ...

  4. sql server 日期函数

    一.sql server日期时间函数Sql Server中的日期与时间函数 1.  当前系统日期.时间     select getdate()  2. dateadd  在向指定日期加上一段时间的基 ...

  5. [转帖]一文看懂mysql数据库本质及存储引擎innodb+myisam

    一文看懂mysql数据库本质及存储引擎innodb+myisam https://www.toutiao.com/i6740201316745740807/ 原创 波波说运维 2019-09-29 0 ...

  6. Java的设计模式(4)--抽象工厂模式

    提供一个创建一系列或相互依赖对象的接口,而无须指定他们具体的类.例如某些系统可能需要为用户提供一系列相关对象,但系统不希望用户直接使用new运算符实例化这些对象,而是应当由系统来控制这些对象的创建,否 ...

  7. WUSTOJ 1287: B304(Java:355ms,C:8ms)

    题目:

  8. docker 实践二:操作镜像

    本篇我们来详细介绍 docker 镜像的操作. 注:环境为 CentOS7,docker 19.03 之前已经说过,容器是 docker 的核心概念之一,所以对应的就需要知道它的使用方法,接下来我们就 ...

  9. 《CAP定理》

    分布式系统的最大难点,就是各个节点的状态如何同步.CAP 定理是这方面的基本定理,也是理解分布式系统的起点. 分布式系统的三个指标 这三个指标不可能同时做到——这个结论就叫做 CAP 定理. Part ...

  10. VMware 克隆的相关设置

    点击管理--克隆,进行克隆操作完成后,进行下面设置: 1.删除原先PCI设置  vi /etc/udev/rules.d/70-persistent-net.rules 2.修改MAC地址及IP  v ...