IIS的运行机制

一,VS自带的IIS(IIS Express)和真实的IIS有什么区别?

1,VS带的IIS是IIS的真实精简版本,叫IIS Express,和IIS完全一样,不同于Development Server,IIS Express支持包括ISAPI等等插件,除了在连接数上的限制以外,IIS Express也没有图形化的管理界面,而且也不是以服务的形式运行,IIS Express的功能和行为几乎和IIS一样。

2,可以理解为:VS自带的那个是虚拟机

3,IIS配置的网站可以被外网访问,VS只是本地调试

4,IIS是一个系统服务,IIS Express则只是一个临时进程。

5,IIS Express相当于一个IIS的精简版本,它拥有IIS几乎所有的功能,但它没有可视化的管理界面

二,IIS是如何处理基于ASP.NET资源(.aspx .asmx)的请求的?

IIS5x

1>IIS5X运行在进程InetInfo.exe中,该进程寄宿着一个名为World Wide Web Publishing Server(简称W3SVC)的Windows服务。W3SVC的主要功能包括HTTP请求的监听、工作进程和配置管理(通过从MetaBase中加载相关的配置信息)等

2>当检测到某个HTTP 请求时,先根据扩展名判断请求的是否是静态资源(比如.html 、.img 、.txt 、.xml 等),如果是,则直接将文件内容以HTTP 回复的形式返回:如果是动态资源(比如.aspx 、.asp 、.php 等) ,则通过扩展名从IIS 的脚本映射C Script Map) 中找到相应的ISAPI 动态连接库CDynamic Link Library, DLL) 。

3>ISAPI C Intemet Server Application Programming Interface) 是一套本地的CNative) Win32API,是IIS 和其他动态Web 应用或平台之间的纽带。ISAPI 定义在一个动态连接库CDLL)文件中, ASP.NET ISAPI 对应的DLL 文件名称为aspnet_isapi. dll ,我们可以在目录"%windir% \Microsoft.NET\Framework\ {version no} \"中找到它。ISAPI 支持ISAPI 扩展CISAPIExtension) 和ISAPI 筛选C ISAPI Filter) ,前者是真正处理HTTP 请求的接口,后者则可以在HTTP 请求真正被处理之前查看、修改、转发或拒绝请求,比如IIS 可以利用ISAPI 筛选进行请求的验证。

4>如果我们请求的是一个基于ASPNET 的资源类型,比如.aspx 、.asmx 和.svc 等,aspnet isapi. dll 会被加载,而AS卫NETISAPI 扩展会创建ASP.NET 的工作进程(如果该进程尚未启动)。对于IIS 5.x 来说,该工作进程为aspnet. exeo IIS 进程与工作进程之间通过命名管道CNamed Pipes) 进行通信。

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

IIS6x

1>通过上面的介绍,我们可以看出IIS 5.x 至少存在着如下两个方面的不足。ISAPI 动态连接库被加载到Inetlnfo.exe 进程中,它和工作进程之间是一种典型的跨进程通信方式,尽管采用命名管道,但是仍然会带来性能的瓶颈。所有的ASP.NET 应用运行在相同进程C aspnet_ wp.exe) 中的不同的应用程序域中,基于应用程序域的隔离不能从根本上解决一个应用程序对另一个程序的影响。在更多的时候,我们需要不同的Web 应用运行在不同的进程中。

2>为了解决第一个问题, IIS 6.0 将ISAPI 动态连接库直接加载到工作进程中:为了解决第二个问题,引入了应用程序池C Application Pool )的机制。我们可以为一个或多个Web 应用创建应用程序池,由于每一个应用程序池对应一个独立的工作进程,从而为运行在不同应用程序池中的Web 应用提供基于进程的隔离级别。IIS 6.0 的工作进程名称为w3wp.exe 。

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

4>严格地说, HTTP.SYS 已经不属于IIS 的范畴了,所以HTTP.SYS 的配置信息也没有保存在IIS 的元数据库CMetabase) 中,而是定义在注册表中。HTTP.SYS 的注册表项的路径为HKEY LOCAL MACHINE/SYSTEMlCurrentControlSetlServices/HTTP 0 HTTP.SYS 能够带来如下的好处。

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

    更好的稳定性: HTTP.SYS 运行在操作系统内核模式下,并不执行任何用户代码,所以其本身不会受到Web 应用、工作进程和IIS 进程的影响。内核模式下数据缓存:如果某个资源被频繁请求, HTTP.SYS 会把响应的内容进行缓存,缓存的内容可以直接响应后续的请求。由于这是基于内核模式的缓存,不存在内核模式和用户模式的切换,响应速度将得到极大的改进。

5>下图,体现了IIS 的结构和处理HTTP 请求的流程。与IIS 5.x 不同, W3SVC 从InetInfo.exe 进程脱离出来(对于IIS 6.0 来说, InetInfo.exe 基本上可以看作单纯的IIS 管理进程) ,运行在另一个进程SvcHost. exe 中。不过W3SVC 的基本功能并没有发生变化,只是在功能的实现上作了相应的改进。与IIS 5.x 一样,元数据库CMetabase) 依然存在于Inetlnfo.exe 进程中。

6>当HTTP.SYS 监听到用户的HTTP 请求时将其分发给W3SVC , W3SVC 解析出请求的URL ,并根据从Metabase 获取的URL 与Web 应用之间的映射关系得到目标应用,并进一步得到目标应用运行的应用程序池或工作进程。如果工作进程不存在(尚未创建或被回收) ,则为该请求创建新的工作进程。我们将工作进程的这种创建方式称为请求式创建。在工作进程的初始化过程中,相应的ISAPI 动态连接库被加载。对于ASP.NET 应用来说,被加载的ISAPI. dll 为aspnet_isap i. dllo AS卫NETISAPI 再负责进行CLR 的加载、应用程序域的创建和Web 应用的初始化等操作。

IIS7x

1>IIS 7在请求的监听和分发机制上又进行了革新性的改进,主要体现在对于Windows进程激活服务C Windows Process Activation Service, WAS) 的引入,将原来CIIS 6.0) W3SVC承载的部分功能分流给了WAS 。通过上面的介绍,我们知道对于IIS 6.0 来说W3SVC 主要承载着3 大功能。

    HTTP 请求接收:接收HTTP.SYS 监听到的HTTP 请求。

    配置管理:从元数据库CMetabase) 中加载配置信息对相关组件进行配置。   

进程管理:创建、回收、监控工作进程。

2>IIS 7.0 将后两组功能实现到了WAS 中,接收HTTP 请求的任务依然落在W3SVC 头上。WAS 的引入为IIS 7.0 提供了对非HTTP 协议的支持。WAS 通过监听器适配器接口CListenerAdapter Interface) 抽象出不同协议监听器。具体来说,除了基于网络驱动的HTTP.SYS 提供HTTP 请求监听功能外还提供了TCP 监听器、命名管道监听器和MSMQ 监昕器以提供基于TCP、命名管道和MSMQ 传输协议的监听支持。

3>与此3 种监听器相对的是3 种监听适配器,它们提供监昕器与WAS 中的监听器适配器接口之间的适配。从这个意义上讲, IIS 7.0 中的W3SVC 更多地为HTTP.SYS 起着监昕适配器的作用。这3 种非HTTP 监听器和监昕适配器定义在程序集SMHost. exe 中,我们可以在目录%windir%\Microsoft.NET飞Framework\v3.0\Windows Communication Foundation \中找到它们。

4>WCF 提供的这3 种监昕器和监昕适配器最终以Windows 服务的形式体现。虽然它们定义在一个程序集中,我们依然可以通过服务工作管理器对其进行单独的启动、终止和配置。SMHost. exe 提供了4 个重要的Windows Service 。NetTcpPortSharing: 为WCF 提供TCP 端口共享。关于端口共享在WCF 中的应用,本人拙著<<WCF 全面解析)) C 上册)对此有详细的介绍。NetTcpActivator: 为WAS 提供基于TCP 的激活请求,包含TCP 监昕器和对应的监听适配器。

    NetPipeActivator: 为WAS 提供基于命名管道的激活请求,包含命名管道监昕器和对应的监听适配器。

    NetMsmqActivator: 为WAS 提供基于MSMQ 的激活请求,包含MSMQ 监昕器和对应的监听适配器。

5>揭示了IIS 7.0 的整体构架及整个请求处理流程。无论是从W3SVC 接收到的HTTP 请求,还是通过WCF 提供的监听适配器接收到的请求,最终都会传递到WAS 。如果相应的工作进程(或者应用程序池)尚未创建,则创建它,否则将请求分发给对应的工作进程进行后续的处理。WAS 在进行请求处理过程中,通过内置的配置管理模块加载相关的配置信息,并对相关的组件进行配置。与IIS 5.x 和IIS 6.0 基于Metabase 的配置信息存储不同的是, IIS 7.0 大都将配置信息存放于XML 形式的配置文件中,基本的配置存放在applicationHost. config 中。

 三,代码请求

posted @ 2017-03-30 12:20  叶丶梓轩  阅读(1009)  评论(0编辑  收藏  举报