从一个页面比如www.xuxiaoyu.net的请求开始如何就能打开blogs页面的呢?这其中发生了什么样的东西?
Http请求(Http Request)
当服务器(IIS)接受到一个Http请求的时候进行以下步骤的处理:
1)服务器获取所请求的页面的后缀名(因为可能是.ASPX,.JPG等不仅仅是ASPX页面)
2)服务器会寻找处理该后缀名的应用程序,如果服务器没有找到这类的后缀名处理程序,并且这个文件也不是受保护的那么将直接返回给客户端。
3)能够处理这类后缀名的应用程序叫做ISAPI应用程序(Internet Server Application Programe Interface),他实际上时一个接口,起到一个代理的作用,主要就是把对应的请求映射到相对应的实际处理程序上去。当一个请求找到一个对应的ISAPI那么他就执行把该请求交给对应的ISAPI进行处理。
我们所常用的.aspx文件是由aspnet_isapi.dll这个程序来处理的。ASP.NET只是IIS的一个组成部分,他是ISAPI的一个扩展而已不是全部。
Http.SYS
那么IIS是如何获取外部的HTTP请求的呢?这个就要依靠HTTP.SYS这个驱动程序了。
1)在操作系统启动的时候,IIS会在HTTP.SYS中注册自己的虚拟路径
2)当一个请求是一个可访问的URL,那么HTTP.SYS就会将这个请求交给IIS工作者进程。(IIS6.0,7.0是W3WP.EXE,5.0是aspnet_wp.exe).每个工作者进程都有一个身份标识,以及一系列的可选参数(比如回收机制的设置,超时设置等)
3)后面的步骤,就是执行上面ISAPI所说的过程了。
从上面可以看出HTTP.SYS是一个内置的驱动程序,他是用来监听外部对IIS的请求的。
4)ISAPI除了进行程序映射外还进行一些其他的操作,从HTTP.SYS中获取当前HTTP请求信息,并且将这些信息保存到HttpWorkerRequest类中,在相互隔离的AppDamain中加载HttpRuntime,调用HttpRuntime的ProcessRequest方法。
5)然后就执行我们程序员所写的代码了
6)IIS接受返回数据流,并且重新返回给HTTP.SYS,最后HTTP.SYS再将这些数据返回给客户端浏览器。
HTTP管道(Pileline)
当一个Http请求到达程序后事怎么处理的呢?
当Http请求进入到Asp.net Runtime以后,它由托管模块(HttpModule)和处理程序(HttpHandler)组成,并且由管道来处理这个Http请求。
整个数据的流动如图所示:
1)HttpRuntime将Http请求转交给HttpApplication(代表着我们创建的web应用程序)。HttpApplication创建针对此Http请求的HttpContext上下文对象用来保存请求的其他对象比如HttpRequest,HttpResponse,HttpSessionState.
2)Http请求通过一系列的Module,这些Module对这个Request具有完全控制权限。然后做一些当前Handler之前的事。
3)Http请求经过所有的HttpModule之后就被HttpHandler处理。
4)然后再返回给HttpModule做一些当前Handler之后的事