笔记:如果不对,欢迎指出来。
当一个用户访问一个页面,实际是发送http请求到服务器,而http请求其实是socket发送特定规范(协议)的文字(报文)。
然后服务器的http.sys内核模块接受 请求,放在请求队列中。
IIS中有两个服务,一个IISADMIN,一个W3SVC服务,当http.sys接受到请求时,会通知w3svc。
然后w3svc会确认下有没有应用程序池,如果没有启动,会启动应用程序池,通知应用程序池,应用程序池会让w3wp.exe工作进程去拿一个请求,如果请求的页面时静态的就会处理直接返回。
如果是.aspx等结尾的动态页面,则会交给aspnet_isapi.dll去处理,它会吧请求交给ISAPIRuntiome函数,执行函数的PR方法,在内部中会吧ecb句柄转成HttpWorkRequest对象,随后转给HttpRuntime,执行它的RP方法,她会把HttpWorkRequest转化成HttpContext。
然后通过HttpApplicationFactory获取一个HttpApplication实例
如果是第一次请求,会找到gloable文件,把他编译成类型,调用application_start方法。
通过HttpApplication池获取一个HttpApplication对象。
如果HttpApplication池未空,则通过gloable文件编译的类型反射出一个实例。
然后就以HttpApplication来负责 管道运作。(二十多个步骤,十九个事件)
第一个和最后一个分别是beginrequest和endrequest事件。
会在第七和第八个事件中根据请求地址创建页面对象,或者一般处理程序对象。
在第九个事件和第十个事件之间会根据cookie中的sessionID加载session状态。
在第十一个事件和第十二个事件中会执行页面对象或者是一般处理程序的pr方法。
如果是一般处理程序,就直接执行了。
如果是页面的话,就开始进入页面的生命周期了。
第一步:是创建页面控件树(控件上没有对应的数据)。
第二步:会确定IsPostBack属性值。
第三步:然后进入初始化。
第四步:再加载viewstate(将viewstate上的数据进行base64解密,并放在对应的内容上),处理回发数据,找到对应改变了的控件和被点击的控件。
第五步:执行preLoad事件,执行page_load事件,由于在load事件中可能会做操作,所以还会进行第二次处理回发数据
第六步:触发控件的改变事件。触发点击事件。结束加载
第七步:预渲染(PreRender)是最后改变页面控件状态的机会。
第八步:保存页面状态,把当前页面状态放入viewstate中。
第九步:渲染,把整个aspx页面渲染成html的过程。
第十步:卸载.