Asp.Net页面生命周期

开发 后端
用户的请求是通过触发HttpApplication的19个事件23个步骤进行处理的。如果是一般处理程序(.ashx),那么执行完管道中的事件后按照原路进行返回。如果是aspx页面那么就开始走页面的生命周期了。

我们都知道,浏览器的作用就是将用户请求的内容封装成HTTP报文的形式,然后通过Socekt套接字和域名解析服务器(DNS)将域名转成ip地址发送到服务器。

服务器端的Windows操作系统分为两个部分,IIS运行在用户模式下,而监听80端口的那部分是运行在内核模式HTTP.SYS(内核模块也是一个插件机制。socket通信机制在内核模块中,内核模块也是一种通信机制)下的,属于HTTP处理的内核模块,内核模式可以监听当前机器所有的Http请求,并将当前请求进行简单解析,确定协议的类型请求的端口,访问注册表,确定当前的请求需要交给IIS进行处理。

IIS接收到请求之后,访问INetInfo.exe(IIS主进程中的元数据信息),判断文件的类型并查询当前的请求需要经过那个扩展程序处理。如果是静态文件(html.,js,jpeg.git),直接将文件从服务器读取出来按照原路返回,如果是动态文件(ashx,aspx),则交给扩展程序aspnet_isapi.dll文件执行,aspnet_isapi.dll是一个扩展程序,实现了IIS内部的一些API,也是一种请求过滤的插件。它的作用是1.负责启动托管环境。2.初始化托管环境。3.将请求分发给托管环境。也就是说,它负责启动aspnet  Runtime创建aspnet运行环境,将请求交给ISAPIRuntime的PR方法。

ISAPIRuntime是进入NET托管环境的入口,它在方法中通过一个ecb句柄指向了当前请求报文体的内存地址,将HTTP请求报文简单封装为一个HttpWorkRequest对象。

调用HttpRuntime.PR(wr:(HttpWorkRequest对象))根据 HttpWorkRequest对象封装成一个HttpContext上下文对象,它包含了所有的请求信息.然后交给HttpApplicationFactory进行处理。

根据HttpApplication获得一个HttpApplication对象的实例,获取实例的时候,先去Application池中去找是否有空闲的HttpApplication对象,如果有则直接返回一个对象,不存在的话就就先编译globle文件生成一个HttpApplication的派生类,通过反射创建一个HttpApplication实例并返回。并开始处理用户的请求。

用户的请求是通过触发HttpApplication的19个事件23个步骤进行处理的。如果是一般处理程序(.ashx),那么执行完管道中的事件后按照原路进行返回。如果是aspx页面那么就开始走页面的生命周期了。

页面生命周期的主要步骤如下:

1.创建页面控制树,那么如何创建页面树的结构呢?把它封装成了一个方法,这个方法的名字就叫做FrameworkInitliaze() 在方法内部给aspx上所有的控件都New一个实例,然后构造一个树的结构即是有一个树的结构。只有执行创建页面之后,页面上才会有控件。

2.判断IspostBack,确定是否回发。

3.初始化

      初始化包括三个阶段:

      1)PreInint()预初始化

         A.调用OnPreinit方法引发PreInit事件

         B.利用App_Themes目录中的内容进行初始化主题。以动态实现一个PageThem  

           属性值,并创建一个编译类的实例。

         C.应用模板页

      2)开始初始化,将所创建的控件树上的控件都new一个实例并赋默认值。

         A.递归初始化Controls集合中的控件,初始化包括设置这些控件的属性。

         B.递归应用控件皮肤。

         C.调用OnInit方法以引发自身的Init事件,接着递归调用子控件的OnInit方法来    

           引发他们的Init事件。

         D.调用自身的TrackViewState方法重启自身的视图状态跟踪,接着递归调用子控                 

            件的TrackViewState方法重启自身的视图状态跟踪。

        3)InitComplete()初始化完成

       4.加载ViewState处理回发数据:

            加载页面状态,解析隐藏域中的ViewState,ViewState保持的值赋值到对应 

        控件中。把需要触发事件的控件放到一个集合当中去。 

       5.预加载(PreLoad)

             页面调用OnPreLoad方法以引发PreLoad事件,该事件表示页面生命周期进 

         入加载阶段。对应sapx.cs中的Page_Load事件。

       6.加载(Load)

             页面首先调用自身的OnLoad方法以引发自身的Load事件,接着递归调用 

         Contorls集合中控件的OnLoad方法以引发它们的Load事件。

       7.ProcessPostData第二次处理回发数据

       8.触发改变的事件和点击事件。

       9.页面加载完成

       10.预渲染,对空间树进行最后一次处理

       11.保存当前页面的状态。

       12.页面渲染

       页面生命周期结束后,形成了页面,继续执行管道之后的事件,执行完毕后按照原路返回到客户端。

 

原文链接:http://www.cnblogs.com/hanwenhuazuibang/archive/2013/04/07/3003289.html

责任编辑:林师授 来源: 博客园
相关推荐

2009-08-04 16:05:15

ASP.NET页面生命

2009-07-31 10:47:18

ASP.NET页面生命

2009-08-04 16:50:15

ASP.NET页面生命

2009-08-03 14:18:40

ASP.NET编程模型ASP.NET页面生命

2012-08-16 09:38:38

ASP.NET

2009-08-03 14:37:38

ASP.NET编程模型页面生命周期

2009-07-20 10:33:02

ASP.NET MVC

2009-07-23 10:23:44

2009-07-23 18:14:17

MVC生命周期

2009-08-10 14:31:46

ASP.NET组件设计ASP.NET控件生命

2009-08-04 17:49:31

Web Page生命周ASP.NET Pos

2009-08-07 16:57:17

ASP.NET页面生存

2009-02-12 13:16:55

请求生命周期MVCASP.NET

2009-07-28 09:46:53

ASP.NET服务器控

2009-07-23 18:55:17

ASP.NET页生命周

2011-06-21 10:26:37

2010-04-02 09:02:02

ASP.NET MVC

2009-08-04 15:58:06

ASP.NET动态控件

2021-04-26 09:22:07

ASP.NET Cor服务周期

2009-07-31 17:53:39

ASP.NET线程安全
点赞
收藏

51CTO技术栈公众号