ASP.NET 生命周期 简介
当我们在浏览器地址栏中输入网址,回车查看页面时,这时会向服务器端(IIS)发送一个request请求,服务器就会判断发送过来的请求页面, 完全识别 HTTP 页面处理程序类后,ASP.NET 运行时将调用处理程序的 ProcessRequest 方法来处理请求,来创建页面对象。通常情况下,无需更改此方法的实现,因为它是由 Page 类提供的。接下来被创建页面对象的ProcessRequest方法使页面经历了各个阶段:初始化、加载视图状态信息和回发数据、加载页面的用户代码以及执行回发服务器端事件。之后,页面进入显示模式:收集更新的视图状态,生成 HTML 代码并随后将代码发送到输出控制台。最后,卸载页面,并认为请求处理完毕。其中页面对象ProcessRequest方法 完成的这一系列事件的处理过程就是Asp.Net页面生命周期。
我们都知道,浏览器的作用就是将用户请求的内容封装成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.页面渲染
页面生命周期结束后,形成了页面,继续执行管道之后的事件,执行完毕后按照原路返回到客户端。
ASP.NET 生命周期 简介的更多相关文章
- Asp.Net生命周期系列三
上文讲到了HttpRunTime主要做了三个事情,我们先回忆一下. 第一:雇佣了项目经理(HttpApplication). 第二:建立了HttpModule列表,项目经理(HttpRunTime)就 ...
- Asp.Net生命周期系列四
上回我们说的当一个Http请求来到HttpModule这里的时候,Asp.Net内部并未对这个Http请求做出任何的处理,我们可以对这个Http请求添加一些我们需要的信息,以方便我们控制这个Http请 ...
- Asp.Net复习篇之Asp.Net生命周期与Asp.Net页的生命周期
Asp.Net生命周期与Asp.Net页的生命周期是一个比较重要的话题,有时可能似乎知道一些,但又说不出个所以然,而且时常把这两个概念混淆.现在也是该好好理清思路,把这两个概念搞懂. Asp.Net生 ...
- Asp.Net生命周期系列六
上篇说到当一个Http请求流到HttpHandler这里时才开始对它的处理,那么一个请求经过HttpHandler之后, 到底怎么对它处理呢,也就是说HttpHandler会触发哪些事件,触发的顺序如 ...
- Asp.Net生命周期系列五
如果您看了我的前四篇文章,应该知道目前Http请求已经流到了HttpModule这个程序员手中了,而且我们可以注册自己的HttpModule并且可以在里面注册一些事件来控制这个Http请求,但是到目前 ...
- Asp.Net生命周期系列二
在上回书开始的时候我们提到博客园的IIS看了一眼我的请求后就直接交给ASP.NET去处理了,并且要求ASP.NET处理完之后返回HTML以供展示. 那么我们不仅要问: 1, IIS肯定是没有眼睛 ...
- ASP.NET生命周期详解
最近一直在学习ASP.NET MVC的生命周期,发现ASP.NET MVC是建立在ASP.NET Framework基础之上的,所以原来对于ASP.NET WebForm中的很多处理流程,如管道事件等 ...
- ASP.NET生命周期详解 [转]
最近一直在学习ASP.NET MVC的生命周期,发现ASP.NET MVC是建立在ASP.NET Framework基础之上的,所以原来对于ASP.NET WebForm中的很多处理流程,如管道事件等 ...
- Android之Activity生命周期简介
概述 有图有真相,所以先上图: 上图是从Android官网截下的Activity的生命周期流程图,结构非常清晰,它描述了Activity在其生命周期中所有可能发生的情况以及发生的先后顺序,下面就将结合 ...
随机推荐
- js跳转传递参数
额,利用j获取了GridView中选中行数据后,通过JavaScript做跳转,传递参数的时候发现,当参数有中文的时候就会乱码, 当然出现这种情况的时候就需要对跳转的url进行编码 var urlX ...
- windows server2008 kettle部署
kettle部署需要有jdk环境,所以需要配置环境变量. 1.首先配置jdk,将jdk压缩包解压到c盘下 增加系统变量:JAVA_HOME:c:\jdk 在path后追加: %JAVA_HOME%\b ...
- html5基础知识点
1.WEB基础知识 1.WEB 与 Internet 1.Internet 互联网 若干台计算机 通过 网线 所连接而成的物理设备 主要服务: 1.Telnet 2.Email 3.WWW(Word ...
- 今天网站后台登录页面需要生成一个二维码,然后在手机app上扫描这个二维码,实现网站登录的效果及其解决方案如下
要实现二维码登录,需要解决2个技术,1.需要js websocket 与后台php实现长连接技术 2.实现二维码生成技术 要实现这个功能第二个算是比较简单,只需要下载一个php的二维码生成器即可,但要 ...
- PHP Date()函数详细参数
在页面的最前页加上 date_default_timezone_set(PRC); /*把时间调到北京时间,php5默认为格林威治标准时间*/ date () a: "am"或是& ...
- ubuntu 一些命令
打开终端 ctrl+alt+t 关闭中端 ctrl+shift+q 打开ppt openoffice.org -g xx.ppt &
- javascript知识点之DOM与window对象
在学习javascript过程中只是一知半解好多,碰到自己不知道属性方法,到最后都不知道自己学到了什么 js代码为什么这样写 为什么你知道这方法或属性可以这样用. DOM和window对象 DOM基本 ...
- Codeforces Round #341 Div.2 D. Rat Kwesh and Cheese
嗯本来想着直接算出来不就行了吗 然后我想到了200^200^200....... 好吧其实也不难取两次log就行了 然后我第一次写出来log就写残了........... log里面的拆分要仔细啊.. ...
- 关于android R.layout.没有出现自己写的布局解决方法
直接上解决方法 1.若import了androi.R直接删除,导入自己包下的R文件,例如com.example.my.R 2.若上面的做了后还有错误,应该是包名不一致导致的,即com.example. ...
- XSD(XML Schema Definition)用法实例介绍以及C#使用xsd文件验证XML格式
XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD),作用是定义 XML 文档的合法构建模块,类似 DTD,但更加强大. 作用有: ①定义 ...