web应用程序生命周期流程从头到结束

浏览器相当于一个客户端,将用户的操作封装成一个满足http协议规范的请求报文。
请求报文规格为请求行,请求头,请求体。
然后根据用户输入的网址,到域名服务器寻找该域名绑定的服务器IP地址。
获得web服务器的IP地址后,再去访问这台web服务器。
 
web服务器中有用户模式和内核模式,内核模式是系统底层的操作
在内核模式中有一个HTTP.SYS内核模块在监听着所有HTTP协议类型的请求
这个HTTP.SYS内核模块获取到该请求后,会进行一个简单的分析,该HTTP请求是访问哪个端口的。
然后这个内核模块会前去注册表中找注册了对应端口的应用程序或者是web服务端软件。如IIS监听着80端口
知道是哪个软件占用了这个端口后,就将该请求直接交给这个软件。
 
通常HTTP请求是走80端口,注册了80端口的则是IIS服务端软件。
HTTP请求则转交给了用户模式下的IIS服务端。
在IIS中有个w3svc的服务会接收这个请求,这个服务一般寄宿在svchost进程中。
在IIS中还有一个主进程inetinfo.exe,内部存储着IIS的配置信息和安全信息。
IIS为了满足大量的动态网页能够运行,则留了一个扩展的接口,
这个接口需要实现从IIS底层的API中获取到请求信息,并且通过底层的API设置响应的报文。
然后配置实现这个接口的扩展程序以及对应的后缀。
 
w3svc服务将分析这个请求需要的文件类型,然后去主进程中找有没有对应的配置的处理扩展
若没有,则直接读取该文件。然后返回给HTTP.SYS内核模块。走通信线程返回给浏览器响应。
若是有(例如aspx,ashx对应的aspnet_isapi.dll),则运行该扩展程序。
这个扩展程序一般是非托管的。会去开启aspRunTime运行环境,然后调用实现了IISAPIRunTime接口的对象的ProcessRequset方法。并且将该请求报文在windows中的句柄(指向请求报文的内存地址)作为参数传递给这个对象。
也就是ISAPIRunTime的PR方法。这个方法使用这个请求报文的句柄将请求报文封装成了一个ISAPIWorkerRequest对象。
然后会启动HttpRunTime的PR方法将这个封装好的ISAPIWorkerRequest对象再次封装次,封装成了一个httpcontext上下文对象。里面包含了请求报文,和响应信息。
 
然后将这个htttcontext交给一个httpApplication对象,这个对象创建是非常耗时的,所以在内部使用了一个对象池的技术,在需要创建这个对象的时候会先在对象池中找,是否有已经创建的空闲的对象。如果有,则直接使用,如果没有,则将Global(全局应用程序类,继承了httpApplication)编译后的程序集反射后创建一个httpApplication.
 
最后执行这个httpApplication的ProcessRequest方法
在httpApplication负责执行的管道中一共有22个步骤及19个事件。
在第7个和8个事件中,会根据请求的文件名创建一个实现了IHttpHanlder接口的对象,web应用程序继承自Page类,而Page类实现了IHttpHanlder。一般处理程序直接继承自IHttpHanlder接口。
 
创建这个对象后,在第11个事件和12个事件的时候,则执行该对象的ProcessRequestMain方法,进入了页面的生命周期。
 
方法的开始就是先根据html模板初始化了整个页面的控件树结构,并将这些C#代码编译到一个方法中。
然后判断IsPostBack是否是回发的数据。
接着进入初始化,在这里分为三个方法会首先加载主题和应用母版页。
然后就是递归初始化控件树中的属性,在初始化的onInit执行完后,就会开始跟踪ViewState状态,如果值发生了改变,则标记为DirtyItem。最后,只有标记为DirtyItem的ViewState才会被序列化到集合中。
 
如果不是第一次进入页面,数据回传的,接下来就会进行ViewState加载。将存储在ViewState中存储的值反序列化,应用到控件中。
同时将提交到表单的值加载到控件中。
 
然后就到我们的页面加载事件。处理我们写的逻辑。
在加载事件中,由于我们会动态创建控件,而这些动态创建的控件还没有ViewState回传,所以在加载事件完毕时,会有个第二次ViewState加载。
然后就是根据ViewState记录的状态进入changed事件和event点击事件。
 
事件执行完之后就是预渲染,这里就是最后一次更改给客户端响应报文的地方了,如果有需要最后才进行处理的,就可以放在预渲染的onPreRender事件中。
 
最后就是保存页面状态,也就是viewstate。
 
保存完毕后,就开始呈现页面给用户,递归创建相应的控件html给浏览器。
整个页面生命周期就到这里结束了。
posted @ 2013-03-21 22:18  李亚金  阅读(843)  评论(0编辑  收藏  举报