浏览器与服务器
1.浏览器发送get或者post请求,传送数据包到服务器,来请求一个页面.
2.服务器的内核模式一直存在一个程序在监听80端口,这个程序就是Http.sys.这个程序是在内核模式下运行的,驱动级别,也就是说,这个程序可以直接操作系统的硬件设备.
3.Http.sys会再注册表中查询是否有程序在监听这个80端口,如果有程序在监听,并且收到了对该端口的请求报文,就把这个报文请求转给相对应的应用程序进程.这时候由内核模式进入用户模式.inetinfo.exe
4.(已经在用户模式)inetinfo.exe这个进程,IIS根据浏览器发来的请求报文的资源后缀以及自身的配置信息,来判断用户请求的是哪类资源,动态的?还是静态的.并且无论动态或者静态,都会启动w3wp.exe这个工作者进程.(此时处于非托管模式)inetinfo.exe这个进程来判断好请求的资源是动态的还是静态的,如果是静态的,w3wp.exe这个进程就去磁盘上找到这个资源,并且返回给浏览器.如果是动态的,在w3wp.exe中调用aspnet_isapi.dll这个程序.(该程序集一直寄宿在w3wp.exe进程之中),并且由这个程序作为一个桥梁,调用.net的ISAPIRuntime运行时(此时已经处于托管模式).,该ISAPIRuntime运行时会执行.net页面请求,并且返回给浏览器.
???????????????????
那么ISAPIRuntime这个运行时,具体是怎么样去创建这个页面,并且以响应报文的形式返回给浏览器的呢?
(1)在ISAPIRuntime中,调用了ProcessRequest(这个方法.)并且将数据报的句柄作为参数,传给该方法.
(2)在ISAPIRuntime的ProcessRequest方法中,声明一个ISAPIWorkerRequest 变量,叫做wr.然后根据这个数据报的句柄编号.利用这个方法来实例化wr对象wr=ISAPIWorkerRequest.CreateWorkerRequest(ecb, useOOP);
这个HttpWorkerRequest对象第一次,原始的封装了数据报
(3)现在还是在在ISAPIRuntime的ProcessRequest方法中.然后在该方法中,调用了HttpRuntime.ProcessRequestNoDemand(wr)这个方法,把封装了数据报的wr作为参数传入,这里有一个 RequestQueue队列,,所有的wr都会先存放在这个队列中.每次从这个队列中拿一个wr,作为参数调用HttpRuntime.ProcessRequestNow(wr);这个方法调用了ProcessRequestInternal(wr)这个方法
在这个方法中,创建了了一个HttpContext对象,这里把经过原始简单封装了数据报的wr作为参数,第二次的封装成了一个HttpContext对象.
(4)然后再HttpRuntime.ProcessRequestNow(wr)中,利用工厂来创建IHttpHandler(应用程序实例)HttpAppliction 对象,以这个context作为参数.
(5)这时候创建出来的 对象,再以Context为参数,调用 HttpAppliction 的ProcessRequest(context).这时候开始进入请求管道,然后执行管道中的19个事件23个步骤.(这里在反编译的时候是IHttpHandler这个接口,并没有显示是HttpApplication对象,但是查看HttpApplication是继承了IHttpHandler,这个接口的,所以可以直接调用ProcessRequest(context)这个方法而进入管道)
|