转载自 博客园 青羽 http://www.cnblogs.com/tenghoo/archive/2009/11/04/IIS_And_ASPNET_Http_Runtime_Pipeline.html#3844243
对于IIS处理请求和管道模型前面一直是半知半解的,没有深入的了解细节,最近看了Artech大佬写的关于IIS请求处理文章,觉得描写分析的很到位,通俗易懂,于是就决定就着大神的分析和自己的理解总结下IIS请求处理和MVC的管道处理原理,以便加深自己的理解,不足之处,敬请谅解。
我们在接触Web开发时肯定就会想到:一个Http请求是怎样被处理的,所呈现的响应又是怎样被返回的,中间执行的原理和细节是怎样的,参与请求处理的又有哪些东西。而对于我们.Net 下Web开发来说,IIS是主要入口,一个Http请求首先到达的入口就是IIS,所以以下的文章就要从两个部分分别描写:IIS处理和ASP.NET MVC请求处理。
IIS对请求的处理
用户访问IIS静态资源,IIS会直接提取对应的文件并将其作为Http Response返回给Client。
用户访问IIS动态资源,IIS会将Request进一步传递给对应的处理程序,处理程序执行完毕获得最终的Http Response通过IIS返回给Client。
上面所说的处理程序就是通过ISAPI Extension来体现。
IIS如何将不同的Resource对应到ISAPI?
IIS的Metadata database维护着一个称为ISAPI Extension Mapping的数据表,负责将不同类型的Resource影射到对应的ISAPI Extension。
ASP.NET对应的ISAPI是什么?
对于基于ASP.NET的资源来说,对应的ISAPI为ASP.NET ISAPI,通过一个aspnet_isapi.dll承载
IIS5.X处理ASP.NET Resource的流程
注意
1、同一台主机上再同一时间只能运行一个aspnet_wp进程,每个基于虚拟目录的ASP.NET Application对应一个Application Domain,也就是说每个Application都运行在同一个Worker Process中,Application之间的隔离是基于Application Domain的,而不是基于Process的。
2、ASP.NET ISAPI不但负责创建aspnet_wp Worker Process,而且负责监控该进程,如果检测到aspnet_wp的Performance降低到某个设定的下限,ASP.NET ISAPI会负责结束掉该进程。当aspnet_wp结束掉之后,后续的Request会导致ASP.NET ISAPI重新创建新的aspnet_wp Worker Process。
3、由于IIS和Application运行在他们各自的进程中,他们之间的通信必须采用特定的通信机制。本质上IIS所在的InetInfo进程和Worker Process之间的通信是同一台机器不同进程的通信(local interprocess communications),处于Performance的考虑,他们之间采用基于Named pipe的通信机制。ASP.NET ISAPI和Worker Process之间的通信通过他们之间的一组Pipe实现。同样处于Performance的原因,ASP.NET ISAPI通过异步的方式将Request 传到Worker Process并获得Response,但是Worker Process则是通过同步的方式向ASP.NET ISAPI获得一些基于Server的变量。
IIS6处理ASP.NET Resource的流程
IIS5.X的缺陷
1)从Performance上看,IIS和application运行在不同的进程中,虽然他们之间采用了基于Named Pipe的异步通信方式,但是一个基于进程之间的通信对性能的影响确实不能从根本上解决。
2)从Reliability来考虑,一台机器上只能运行一个worker process,每个Application运行在同一个进程中,虽然基于Application Domain的隔离能提供一定的Reliability,但是一旦整个进程崩溃,所有的Application都受影响。所以我们有时候需要提供一个基于Process的隔离性。
IIS6的改进
1)基于Reliability的改进,IIS 6引入了Application Pool。
在创建Web Application的时候,我们为它指定一个既定的application pool。在运行的时候,一个Application对应一个Worker Process:w3wp.exe。,同一台机器上可以同时运行多个Worker Process,每个Worker Process中的每个Application domain对应一个Application。
2)在Performance方面,IIS 5.x是通过InetInfo.exe监听Request并把Request分发到Work Process。换句话说,在IIS 5.x中对Request的监听和分发是在User Mode(用户模式)中进行,在IIS 6中,这种工作被移植到kernel Mode(内核模式)中进行,所有的这一切都是通过一个新的组件:http.sys来负责。
管道模型