浏览器整体请求过程小结

浏览器发送请求报文给服务器,服务器端的服务器软件(iis)会根据解析请求报文,如果浏览器请求的是静态页面,那么webserver根据反射找到服务器端中静态页名为浏览器请求页面名称为名的静态页面(html,ht,js,css..),然后通过套接字发送响应报文给浏览器,浏览器解析并执行响应报文,呈现给用户.

如果是动态页面,则需要在服务器端执行一系列操作,发送响应报文给浏览器端.大概的过程是这样的:

浏览器请求一个动态页面,webserver发现解析不了(因为开发服务器端软件的时候还没有asp.net这种动态网页技术),需要调用freamwork,怎么办呢,于是开发freamwork的部门就根据webserver开放的接口,写了一个中间程序ISapi,(internet server application programming interface,扩展程序接口),这个中间程序可以调用freamwork处理请求.webserver根据反射找到可以执行浏览器请求动态页面的isapi,isapi调用网站程序,其中有个ISAPIRuntime,调用ISAPIRuntime的PR方法,在这个方法中先构建了一个httpworkrequest对象,第一次封装了请求报文,然后调用httpruntime类的ProcessRequestNoDemand(wr)方法,这个方法里面设置了请求队列,又调用了ProcessRequestNow(wr);方法,这个方法里又调用了_theRuntime.ProcessRequestInternal(wr);方法,这个方法里:首先根据传进来的wr,创建了一个context对象,就是我们常说的上下文对象,这是第二次封装请求报文,把请求报文按批次,按顺序放到HttpRequest对象中,同时也初始化了HttpResponse方法,HttpResponse方法里面主要就是初始化了一个httpwriter(我理解为写出器),然后调用了HttpApplicationFactory.GetApplicationInstance(context);方法,这个方法就相当于一个处理请求报文的管道,里面主要有19个标准的事件:

在第八个事件中根据反射创建了请求页面类对象,并实现IHttpHandel接口(接口里面有一个PR方法),然后第九个事件中,根据浏览器发送的sessionid,在服务器端的session池中找到对应的session对象,并赋给页面类对象的session对象,在第十一和十二个事件中间,才开始执行页面类对象的PR方法,也就是我们写的一般处理程序,,这里面才是真正处理请求报文的地方,在这个PR方法中,先构建了页面的控件对象,然后执行页面生存周期的Page_Load方法,调用每个控件对象的render方法,这个方法的功能就是为每个控件生成html代码,它执行的时候会先去检查服务器端控件对象的属性,根据属性的值生成对应的html代码.处理完成后,调用httpresponse类的一个httpwrite属性,但不是立即把html代码响应给浏览器解析,而是保存在httpwriter的缓存中.

posted @ 2012-10-07 19:57  老精灵  阅读(1457)  评论(0)    收藏  举报