原文地址:http://www.cnblogs.com/fsjohnhuang/articles/2332074.htmlhtml
ASP.NET是一个很是强大的构建Web应用的平台,它提供了极大的灵活性和能力以至于能够用它来构建全部类型的Web应用。windows
绝大多数的人只熟悉高层的框架如: WebForms 和 WebServices --这些都在ASP.NET层次结构在最高层。
这篇文章的资料收集整理自各类微软公开的文档,经过比较 IIS五、IIS六、IIS7 这三代 IIS 对请求的处理过程, 让咱们熟悉 ASP.NET的底层机制 并对请求(request)是怎么从Web服务器传送到ASP.NET运行时有所了解。经过对底层机制的了解,可让咱们对 ASP.net 有更深的理解。 api
IIS 5 的 ASP.net 请求处理过程浏览器
对图的解释:缓存
IIS 5.x 一个显著的特征就是 Web Server 和真正的 ASP.NET Application 的分离。做为 Web Server 的IIS运行在一个名为 InetInfo.exe 的进程上,InetInfo.exe 是一个Native Executive,并非一个托管的程序,而咱们真正的 ASP.NET Application 则是运行在一个叫作 aspnet_wp 的 Worker Process 上面,在该进程初始化的时候会加载CLR,因此这是一个托管的环境。服务器
ISAPI: 指可以处理各类后缀名的应用程序。 ISAPI 是下面单词的简写 :Internet Server Application Programe Interface,互联网服务器应用程序接口。架构
IIS 5 模式的特色:app
IIS6 的 ASP.net 请求处理过程框架
对图的解释:异步
IIS 5.x 是经过 InetInfo.exe 监听 Request 并把Request分发到Work Process。换句话说,在IIS 5.x中对Request的监听和分发是在User Mode中进行,在IIS 6中,这种工做被移植到kernel Mode中进行,全部的这一切都是经过一个新的组件:http.sys 来负责。
注:为了不用户应用程序访问或者修改关键的操做系统数据,windows提供了两种处理器访问模式:用户模式(User Mode)和内核模式(Kernel Mode)。通常地,用户程序运行在User mode下,而操做系统代码运行在Kernel Mode下。Kernel Mode的代码容许访问全部系统内存和全部CPU指令。
在User Mode下,http.sys接收到一个基于 aspx 的http request,而后它会根据IIS中的 Metabase 查看该基于该 Request 的 Application 属于哪一个Application Pool, 若是该Application Pool不存在,则建立之。不然直接将 request 发到对应Application Pool 的 Queue中。
每一个 Application Pool 对应着一个Worker Process:w3wp.exe,毫无疑问他是运行在User Mode下的。在IIS Metabase 中维护着 Application Pool 和worker process的Mapping。WAS(Web Administrative service)根据这样一个mapping,将存在于某个Application Pool Queue的request 传递到对应的worker process(若是没有,就建立这样一个进程)。在 worker process 初始化的时候,加载ASP.NET ISAPI,ASP.NET ISAPI 进而加载CLR。最后的流程就和IIS 5.x同样了:经过AppManagerAppDomainFactory 的 Create方法为 Application 建立一个Application Domain;经过 ISAPIRuntime 的 ProcessRequest处理Request,进而将流程进入到ASP.NET Http Runtime Pipeline。
IIS 7 的 ASP.net 请求处理过程
IIS7 站点启动并处理请求的步骤以下图:
步骤 1 到 6 ,是处理应用启动,启动好后,之后就不须要再走这个步骤了。
上图的8个步骤分别以下:
W3WP.exe 进程中又是若是处理得呢?? IIS 7 的应用程序池的托管管道模式分两种: 经典和集成。 这两种模式下处理策略各不相通。
本文做者:郭红俊 http://blog.joycode.com/ghj
IIS 6 以及 IIS7 经典模式的托管管道的架构
在IIS7以前,ASP.NET 是以 IIS ISAPI extension 的方式外加到 IIS,其实包括 ASP 以及 PHP,也都以相同的方式配置(PHP 在 IIS 采用了两种配置方式,除了 IIS ISAPI extension 的方式,也包括了 CGI 的方式,系统管理者能选择 PHP 程序的执行方式),所以客户端对 IIS 的 HTTP 请求会先经由 IIS 处理,而后 IIS 根据要求的内容类型,若是是 HTML 静态网页就由 IIS 自行处理,若是不是,就根据要求的内容类型,分派给各自的 IIS ISAPI extension;若是要求的内容类型是 ASP.NET,就分派给负责处理 ASP.NET 的 IIS ISAPI extension,也就是 aspnet_isapi.dll。下图是这个架构的示意图。
IIS 7 应用程序池的 托管管道模式 经典 模式也是这样的工做原理。 这种模式是兼容IIS 6 的方式, 以减小升级的成本。
IIS6 的执行架构图,以及 IIS7 应用程序池配置成经典模式的执行架构图
IIS 7 应用程序池的 托管管道模式 集成模式
而 IIS 7 彻底整合 .NET 以后,架构的处理顺序有了很大的不一样(以下图),最主要的缘由就是 ASP.NET 从 IIS 插件(ISAPI extension)的角色,进入了 IIS 核心,并且也能以 ASP.NET 模块负责处理 IIS 7 的诸多类型要求。这些 ASP.NET 模块不仅能处理 ASP.NET 网页程序,也能处理其余如 ASP 程序、PHP 程序或静态 HTML 网页,也由于 ASP.NET 的诸多功能已经成为 IIS 7 的一部份,所以 ASP 程序、PHP 程序或静态 HTML 网页等类型的要求,也能使用像是Forms认证(Forms Authentication)或输出缓存(Output Cache)等 ASP.NET 2.0 的功能(但须修改 IIS 7 的设定值)。也由于 IIS 7 容许自行以 ASP.NET API 开发并加入模块,所以 ASP.NET 网页开发人员将更容易扩充 IIS 7 和网站应用程序的功能,甚至能自行以 .NET 编写管理 IIS 7 的程序(例如以程控 IIS 7 以建置网站或虚拟目录)
IIS 7 的执行架构图(集成托管信道模式下的架构)
小结
参考资料:
ASP.NET Process Model之一:IIS 和 ASP.NET ISAPI http://www.cnblogs.com/artech/archive/2007/09/09/887528.html
ASP.NET Internals – IIS and the Process Model http://dotnetslackers.com/articles/iis/ ASPNETInternalsIISAndTheProcessModel.aspx
模组化的IIS 7 与.NET 能力整合 http://www.microsoft.com/taiwan/technet/columns/profwin/ 33-iis7-componentization-integration.mspx
Introduction to IIS 7.0 Architecture http://learn.iis.net/page.aspx/101/introduction-to-iis7-architecture/