【ASP.NET Process Model 笔记 一】第一次深入理解 IIS 和 ASP.NET ISAPI 的处理过程
下面是个人的吐血总结,理解处理过程中重要的图:
IIS 5.x的处理过程:
- InetInfo.exe(即IIS 5所在的进程)接受请求。(在User Mode即用户模式下进行)
- 一些IIS能处理的文件,如静态文件则直接返回给浏览器,若不行则通过ISAPI Extension Mapping获知对应的ISPAI为ASP.NET ISAPI(当请求为.aspx文件时)
- ASP.NET ISAPI创建进程aspnet_wp.exe(注:该进程跑着全部Application,通过AppDomain分离)
- 接着进入管道处理HttpRuntime->HttpWorkerRequest->HttpApplicationFactory。
IIS 6的处理过程:
- 组件Http.sys来侦听请求。(在Kernel Mode即用户模式下进行)
- 找到对应的Application Pool(每个Application会有一个App Pool,每个Pool跑在对应的w3wp.exe进程中),将请求加入到Application Pool Queue。
- 在Application Pool所在的进程初始化时就加载ASP.NET ISAPI,ASP.NET ISAPI进而加载CLR。
- 接着进入管道处理HttpRuntime->HttpWorkerRequest->HttpApplicationFactory。(此步骤与IIS 5相同)
IIS 5.x 与IIS 6的主要差异:
- iis 5是一个进程跑全部 Application;iis 6是每一个Appliction对应一个进程,每个进程是一个Application Pool。
- IIS 5:InetInfo.exe(即IIS 5所在的进程)接受请求。(在User Mode即用户模式下进行) ;IIS 6:组件Http.sys来侦听请求。(在Kernel Mode即用户模式下进行
- aspnet_isapi.dll的作用点不用:iis 5中, InetInfo.exe找到对应的isapi即aspnet_isapi后,是aspnet_isapi创建Worker Process。iis 6中,在worker process初始化的时候,aspnet_isapi被加载,然后aspnet_isapi加载CLR。也就是说,iis 5中aspnet_isapi创建了worker process,而iis 6是worker process初始化时,才加载的aspnet_isapi。所以最上面的图中,iis 5的aspnet_api.dll在worker process图外,iis 6的aspnet_api.dll在图内。
概括:
- 所谓http管道就是 HttpRuntime->HttpWorkerRequest->HttpApplicationFactory
- 注:为了避免用户应用程序访问或者修改关键的操作系统数据,windows提供了两种处理器访问模式:用户模式(User Mode)和内核模式(Kernel Mode)。一般地,用户程序运行在User mode下,而操作系统代码运行在Kernel Mode下。Kernel Mode的代码允许访问所有系统内存和所有CPU指令。关于User Mode和Kernel Mode以及一些Windows底层的一些内容,推荐大家看看《Microsoft Windows Internal》Four Edition, Authored by Mark E.Russinovich & David A. Solomon。
参考资料:
Reference:
A low-level Look at the ASP.NET Architecture
ASP.NET Process Model
[原创]ASP.NET Process Model之一:IIS 和 ASP.NET ISAPI
[原创]ASP.NET Process Model之二:ASP.NET Http Runtime Pipeline - Part I
A low-level Look at the ASP.NET Architecture
ASP.NET Process Model
[原创]ASP.NET Process Model之一:IIS 和 ASP.NET ISAPI
[原创]ASP.NET Process Model之二:ASP.NET Http Runtime Pipeline - Part I
[原创]ASP.NET Process Model之二:ASP.NET Http Runtime Pipeline - Part II
精简概括: