IIS与ASP.NET Http Runtime Pipeline

最近在看artech的wcf文章时,接触到他的几篇IIS 和 ASP.NET ISAPI的文章,感觉写的非常好。同时参考其他一些资料对IIS与ASP.NET Http Runtime Pipeline做了这次简单的总结。

 对于IIS处理asp.net资源的流程梳理一番后,大致画了下面这些图,目的是为了加深理解。更详细内容可以查看artech的几篇文章:http://www.cnblogs.com/artech/archive/2007/09/09/887528.html

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来负责。

 

ASP.NET Http Runtime Pipeline

 

 

 


posted @ 2009-11-04 16:36  青羽  阅读(3183)  评论(2编辑  收藏  举报