IIS5架构图
IIS5 的所有组件都工作在用户模式中,核心组件INETINFO侦听WinSock端口(例如常见的TCP 80端口)。当HTTP访问请求到达时,工作在内核模式的TCP/IP驱动将其直接路由到Inetinfo.exe进程,Inetinfo.exe进程自己本身对此请求进行处理或者将其交付扩展组件(如ISAPI扩展)进行处理。IIS5 使用COM+提供的DLLHOST基础结构方式进行工作。
IIS5具有以下的缺陷:
在Inetinfo.exe中执行第三方代码,但如果执行的代码有问题,那么会导致整个Web服务器停止工作;
ISAPI Dll被加载到InetInfo.exe进程中,它和工作进程之间是一种典型的跨进程通信方式,尽管采用性能最好的命名管道,但是仍然会带来性能的瓶颈;
所有的ASP.NET应用,运行在相同的进程(aspnet_wp.exe)中的不同的应用程序域(AppDomain)中,基于应用程序域的隔离级别不能从根本上解决一个应用程序对另一个程序的影响,在更多的时候,我们需要不同的Web应用运行在不同的进程中。
II5和ASP.NET
IIS 5运行在IIS进程InetInfo.exe中,在该进程中一个最重要的服务就是World Wide Web Publishing Service(简称W3SVC)的Windows Service。W3SVC的主要功能包括HTTP请求的监听、工作进程的管理以及配置管理(通过从Metabase中加载相关配置信息)等。
当检测到某个HTTP Request后,先根据扩展名判断请求的是否是静态资源(比如.html,.img,.txt,.xml等),如果是则直接将文件内容以HTTP Response的形式返回。如果是动态资源(比如.aspx,asp,php等等),则通过扩展名从IIS的脚本影射(Script Map)找到相应的ISAPI Dll。
ISAPI是Internet服务器API(Internet Server Application Programming Interface)的缩写,是一套本地的Win32 API,具有较高的执行性能,是IIS和Web应用或者平台之间的纽带。比如ASP ISAPI桥接IIS与ASP,而ASP.NET ISAPI则连接着IIS与ASP.NET。ISPAI定义在一个Dll中,ASP.NET ISAPI对应的Dll为Aspnet_isapi.dll,你可以在目录“%windir%\Microsoft.NET\Framework\{version no}\”中找到该Dll。
ISAPI支持ISAPI扩展和ISAPI筛选,前者是真正处理HTTP请求的接口,后者则可以在HTTP请求真正被处理之前查看、修改、转发或者拒绝请求,比如IIS可以利用ISAPI筛选进行请求的验证(Authentication)。
如果请求ASP.NET的资源类型,Aspnet_isapi.dll会被加载,ASP.NET ISAPI扩展会创建ASP.NET的工作进程(如果该进程尚未启动),对于IIS 5.x来说,该工作进程为aspnet_wp.exe。IIS进程与工作进程之间通过命名管道进程通信,以获得最好的性能。
在工作进程初始化过程中,.NET 运行时(CLR)被加载,从而构建了一个托管的环境。对于某个Web应用的初次请求,CLR会为其创建一个AppDomain。在此AppDomain中,HTTP Runtime被加载并用以创建相应的应用。对于寄宿于IIS 5.x的所有Web 应用都运行在同一个进程(工作进程Aspnet_wp.exe)的不同AppDomain中。
参考:1. II5架构 http://www.cnblogs.com/zhaozhan/archive/2010/08/17/1801792.html
2. IIS7机构原理 http://www.cnblogs.com/isdavid/archive/2013/05/28/3103228.html