学习ASP.NET MVC框架揭底笔记-IIS/ASP.NET管道(一)

学习ASP.NET MVC框架揭秘笔记-IIS/ASP.NET管道(一)

 IIS/ASP.NET管道

ASP.NET MVC就是建立在ASP.NET平台基础上基于MVC模式的Web应用框架,深入理解ASP.NET MVC的前提是对ASP.NET管道式设计有深刻的认识。由于ASP.NET Web应用大都寄宿于IIS上,接下来会介绍3个主要的IIS版本对各自Web请求的处理方式。

1.3.1 IIS 5.xASP.NET

IIS 5.x运行在进程InetInfo.exe中,该进程寄宿着一个名为World WideWeb Publishing Service(简称W3SVC)的Windows服务。W3SVC主要负责HTTP请求的监听、激活和管理工作进程、加载配置(通过从Metabase中加载相关配置信息)等。

当检测到某个HTTP请求时,IIS先根据扩展名判断请求的是静态资源(比如.html.img.txt.xml等)还是动态资源。对于前者,IIS会将文件的内容直接响应给客户端,对于动态资源(比如.aspx.asp.php等)则通过扩展名从IIS的脚本映射(Script Map)中找到相应的ISAPI动态链接库(Dynamic Link LibraryDLL)。

ISAPIInternet Server Application Programming Interface)是一套本地的(NativeWin32API,是IIS和其他动态Web应用或平台的纽带。ISAPI定义在一个动态链接库(DLL)文件中,ASP.NET ISAPI对应的DLL文件名称为aspnet_isapi.dllISAPI支持ISAPI扩展和ISAPI筛选。前者是真正处理HTTP请求的接口,后者则可以在HTTP请求请求真正被处理之前查看、修改、转发或拒绝请求,比如IIS可以利用ISAPI可以利用ISAPI筛选进行请求的验证。

如果我们请求的是一个基于ASP.NET的资源类型,比如.aspx.asmx.svc等,aspnet_isapi.dll会被加载,ASP.NET ISAPI随后会创建ASP.NET的工作进程(如果该进程尚未启动)。对于IIS5.x来说,该工作进程为aspnet.exeIIS进程与工作进程之间通过命名管道进行通信。

在工作进程初始化过程中,.NET运行时(CLR)会被加载以构建一个托管的环境。对于某个Web应用的初次请求,CLR会为其创建一个应用程序域。在应用程序域中,HTTP运行时被加载并用以创建相应的应用。寄宿于IIS 5.x的所有Web应用都运行在同一个进程(工作进程aspnet.exe)的不同应用程序域中。

1.3.2IIS6.0ASP.NET

通过前面的介绍,我们可以看出IIS5.x至少存在如下两个方面的不足。

1.ISAPI动态链接库被加载到Interinfo.exe进程中,它和工作进程之间是一种典型的跨进程通信方式,尽管采用命名管道,但是仍然会带来性能的瓶颈。

2.所有的ASP.NET应用运行在相同进程的不同应用程序域中,基于应用程序域的隔离不能从根本上解决一个应用程序对另一个应用程序的影响,在更多的时候我们需要不同的Web应用运行在不同的进程中。

为了解决第一个问题,IIS6.0ISAPI动态链接库直接加载到工作进程中。为了解决第二个问题,在IIS6.0中引入了应用程序池的机制。我们可以为一个或多个Web应用创建一个应用程序池,没一个应用程序池对应一个独立的工作进程(w3wp.exe),所以运行在不同应用程序池中的Web应用提供基于进程级别的隔离机制。

除了上面两点改进之外,IIS6.0还有其他一些值得称道的地方,其中最重要的一点就是创建了一个名为HTTP.SYSHTTP监听器。HTTP.SYS以驱动程序的形式运行在Window的内核模式下,它是WindowTCP/IP网络子系统的一部分,从结构上看它属于TCP之上的一个网络驱动程序。

严格地说,HTTP.SYS已经不属于IIS的范畴了,所以HTTP.SYS的配置信息也没有保存在IIS的元数据库(Metabase),而是定义在注册表中。HTTP.SYS能带来如下的好处。

1.持续监听。由于HTTP.SYS是一个网络驱动程序,始终处于运行程序,所以对于用户的HTTP请求能够及时作出反应。

2.更好的稳定性。HTTP.SYS运行在操作系统内核模式下,并不执行任何用户代码,所以其本身不会受到Web应用、工作进程和IIS进程的影响。

3.内核模式下数据缓存。如果某个资源被频繁请求,HTTP.SYS会把响应的内容进行缓存,缓存的内容可以直接响应后续的请求。由于这是基于内核模式的缓存,不存在内核模式和用户模式的切换,响应速度将得到极大的改进。

当监听到HTTP请求时,HTTP.SYS将其分发给W3SVC,后者解析出请求的URL,并根据从Metabase获取的URLWeb应用之间的映射关系得到目标应用,进而得到目标应用运行的应用进程池或工作进程。如果工作进程不存在(尚未创建或被回收),它为该请求创建新的工作进程。在工作进程的初始化过程中,相应的ISAP动态链接库被加载,对于ASP.NET应用来说,被加载的ISAPI.dllaspnet_isapi.dllASP.NET ISAPI负责进行CLR的加载、应用程序域的创建和Web应用的初始化等操作。

在下一章我们来讲解IIS7.0和ASP.NET