IIS中的HTTP请求处理
本节中的图表提供了正在处理的HTTP请求的概述。
以下列表描述了图中显示的请求处理流程:
- 当客户端浏览器向Web服务器上的资源发起一个HTTP请求时,HTTP.sys拦截该请求。
- HTTP.sys联系WAS从获取配置信息。
- WAS从配置存储applicationHost.config中请求配置信息。
- WWW服务接收配置信息,例如应用程序池和站点配置。
- WWW服务使用配置信息来配置HTTP.sys。
- WAS启动进行请求的应用程序池的工作进程。
- 工作进程处理该请求并向HTTP.sys返回响应。
- 客户端收到回应。
在工作进程中,HTTP请求会通过Web Server Core中的几个有序步骤(称为事件)。在每个事件中,本地模块处理部分请求,例如验证用户或向事件日志添加信息。如果请求需要托管模块,则本地ManagedEngine模块将创建一个AppDomain,其中托管模块可以执行必要的处理,例如使用Forms身份验证对用户进行身份验证。当请求通过Web Server Core中的所有事件时,响应将返回到HTTP.sys。图2显示了一个进入工作进程的HTTP请求。
IIS组件介绍
本文将介绍IIS的组件,模块和请求处理体系结构:
IIS包含几个组件,这些组件在WindowsServer®2008(IIS 7.0)和Windows Server 2008 R2(IIS 7.5)中为应用程序和Web服务器角色执行重要功能。每个组件都有责任,例如监听对服务器的请求,管理进程和读取配置文件。这些组件包括协议侦听器(如HTTP.sys)和服务(如万维网发布服务(WWW服务)和Windows进程激活服务(WAS))。
协议监听器
协议侦听器接收协议特定的请求,将它们发送到IIS进行处理,然后将响应返回给请求者。例如,当客户端浏览器从Internet请求Web页面时,HTTP侦听程序HTTP.sys将拾取请求并将其发送到IIS进行处理。一旦IIS处理请求,HTTP.sys就会向客户端浏览器返回响应。
默认情况下,IIS提供HTTP.sys作为侦听HTTP和HTTPS请求的协议侦听器。HTTP.sys是在IIS 6.0中作为HTTP请求的HTTP特定协议侦听器引入的。HTTP.sys仍然是IIS 7及更高版本中的HTTP侦听器,但包括对安全套接字层(SSL)的支持。
要支持使用HTTP和HTTPS以外的协议的服务和应用程序,可以使用Windows Communication Foundation(WCF)等技术。WCF具有侦听器适配器,可提供协议侦听器和侦听器适配器的功能。侦听器适配器将在本文后面介绍。有关WCF的更多信息,请参阅MSDN上的Windows Communication Foundation。
超文本传输协议栈(HTTP.sys)
HTTP侦听器是Windows操作系统的网络子系统的一部分,它被实现为称为HTTP协议栈(HTTP.sys)的内核模式设备驱动程序。HTTP.sys侦听来自网络的HTTP请求,将请求传递到IIS进行处理,然后将处理后的响应返回给客户端浏览器。
在IIS 6.0中,HTTP.sys替换了Windows Sockets API(Winsock),它是由以前版本的IIS用来接收HTTP请求和发送HTTP响应的用户模式组件。IIS 7和更高版本继续依赖HTTP.sys来处理HTTP请求。
HTTP.sys提供了以下好处:
- 内核模式缓存。无需切换到用户模式即可提供缓存响应请求。
- 内核模式请求排队。请求在上下文切换中引起较少的开销,因为内核将请求直接转发给正确的工作进程。如果没有工作进程可用于接受请求,则内核模式请求队列将保留该请求,直到工作进程将其请求为止。
- 请求预处理和安全过滤。
万维网发布服务(WWW服务)
在IIS 7和更高版本中,以前由万维网发布服务(WWW服务)单独处理的功能现在分为两个服务:WWW服务和一个新服务Windows进程激活服务(WAS)。这两个服务在同一Svchost.exe进程中作为LocalSystem运行,并共享相同的二进制文件。
注意您也可以在文档中看到称为W3SVC的WWW服务。
WWW服务如何在IIS中工作
在IIS中,WWW服务不再管理工作进程。相反,WWW服务是HTTP侦听器HTTP.sys的侦听器适配器。作为监听适配器,WWW服务主要负责配置HTTP.sys,在配置更改时更新HTTP.sys,并在请求进入请求队列时通知WAS。
此外,WWW服务继续收集网站的计数器。因为性能计数器仍然是WWW服务的一部分,所以它们是HTTP特定的,不适用于WAS。
Windows进程激活服务(WAS)
在IIS 7和更高版本中,Windows进程激活服务(WAS)管理应用程序池配置和工作进程,而不是WWW服务。这使您可以为HTTP和非HTTP站点使用相同的配置和流程模型。
另外,如果您不需要HTTP功能,则可以在不使用WWW服务的情况下运行WAS。例如,如果您不需要在HTTP.sys中侦听HTTP请求,则可以通过WCF侦听器适配器(如NetTcpActivator)管理Web服务,而无需运行WWW服务。有关WCF侦听器适配器以及如何使用WAS在IIS 7和更高版本中托管WCF应用程序的信息,请参阅MSDN上的WCF托管。
WAS中的配置管理
在启动时,WAS从ApplicationHost.config文件读取某些信息,并将该信息传递给服务器上的侦听器适配器。侦听器适配器是在WAS和协议侦听器(如HTTP.sys)之间建立通信的组件。一旦侦听器适配器接收到配置信息,它们将配置其相关协议侦听器,并准备侦听器侦听请求。
在WCF的情况下,侦听器适配器包含协议侦听器的功能。因此,WCF侦听器适配器(如NetTcpActivator)是基于来自WAS的信息进行配置的。一旦配置了NetTcpActivator,它将侦听使用net.tcp协议的请求。有关WCF侦听器适配器的更多信息,请参阅MSDN上的WAS激活体系结构。
以下列表描述了WAS从配置中读取的信息的类型:
- 全局配置信息
- HTTP和非HTTP协议的协议配置信息
- 应用程序池配置,例如进程帐户信息
- 站点配置,如绑定和应用程序
- 应用程序配置,例如应用程序所属的已启用的协议和应用程序池
如果ApplicationHost.config发生更改,WAS将收到通知并使用新信息更新侦听器适配器。
流程管理
WAS管理HTTP和非HTTP请求的应用程序池和工作进程。当协议侦听器拿起客户端请求时,WAS将确定工作进程是否正在运行。如果应用程序池已经有一个正在处理请求的工作进程,那么侦听器适配器会将请求传递到工作进程上进行处理。如果应用程序池中没有工作进程,则WAS将启动一个辅助进程,以便侦听适配器可以将请求传递给它进行处理。
注意:因为WAS管理HTTP和非HTTP协议的进程,所以可以在同一个应用程序池中运行具有不同协议的应用程序。例如,您可以开发一个应用程序(如XML服务),并通过HTTP和net.tcp进行托管。
在IIS中的模块
IIS提供了一个与以前版本的IIS不同的新体系结构。IIS不包含服务器本身的大部分功能,而是包含一个Web服务器引擎,您可以在其中添加或删除称为模块的组件,具体取决于您的需要。
模块是服务器用于处理请求的个别功能。例如,IIS使用身份验证模块来验证客户端凭据,并使用缓存模块来管理缓存活动。
新的体系结构比以前版本的IIS提供了以下优点:
- 你可以在服务器上控制你想要的模块。
- 您可以将服务器自定义为您环境中的特定角色。
- 您可以使用自定义模块来替换现有模块或引入新功能。
新的架构也提高了安全性并简化了管理。通过删除不必要的模块,可以减少服务器的攻击面和内存占用量,这是服务器工作进程在计算机上使用的内存量。您还可以不必管理您的站点和应用程序不需要的功能。
IIS中的请求处理
在IIS中,IIS和ASP.NET请求管道结合使用集成方法处理请求。新的请求处理体系结构包括一个本地和托管模块的有序列表,它们根据请求执行特定的任务。
与以前版本的IIS相比,此设计提供了几个优点。首先,所有文件类型都可以使用原来只能用于托管代码的功能。例如,您现在可以对站点和应用程序中的静态文件,活动服务器页面(ASP)文件以及所有其他文件类型使用ASP.NET窗体身份验证和统一资源定位器(URL)授权。
其次,这种设计消除了IIS和ASP.NET中几个功能的重复。例如,当客户端请求托管文件时,服务器将调用集成管道中的相应认证模块来认证客户端。在以前的IIS版本中,这个相同的请求将通过IIS管道和ASP.NET管道中的身份验证过程。
第三,你可以在一个位置管理所有的模块,而不是在IIS中管理一些功能,在ASP.NET配置中管理一些功能。这简化了服务器上的站点和应用程序的管理。
在IIS中的应用程序池
应用程序按进程边界分隔应用程序,以防止应用程序影响服务器上的另一个应用程序。在IIS 7和更高版本中,应用程序池继续使用IIS 6.0工作进程隔离模式。另外,您现在可以指定一个设置来确定如何处理涉及受管资源的请求:集成模式或经典模式。
注意:在IIS 6.0中,在服务器级别设置工作进程隔离模式和IIS 5.0隔离模式。这使得无法在同一台服务器上运行两种隔离模式。但是,在IIS 7和更高版本中,应用程序池级别设置了集成模式和经典模式,这使您可以在同一服务器上的不同进程模式的应用程序池中同时运行应用程序。
集成应用程序池模式
当应用程序池处于集成模式时,可以利用IIS和ASP.NET的集成请求处理体系结构。当应用程序池中的工作进程收到请求时,请求会通过一个有序的事件列表。每个事件都会调用必要的本地和托管模块来处理部分请求并生成响应。
在集成模式下运行应用程序池有几个好处。首先将IIS和ASP.NET的请求处理模型集成到统一的流程模型中。此模型消除了以前在IIS和ASP.NET中重复的步骤,如身份验证。此外,集成模式可以使所有内容类型的托管功能可用。
经典应用程序池模式
当应用程序池处于经典模式时,IIS 7和更高版本以与IIS 6.0工作进程隔离模式中相同的方式处理请求。ASP.NET请求首先会经过IIS中的本机处理步骤,然后被路由到Aspnet_isapi.dll以处理托管运行时中的托管代码。最后,请求通过IIS路由回来发送响应。
IIS和ASP.NET请求处理模型的这种分离会导致一些处理步骤(如身份验证和授权)的重复。此外,托管代码功能(例如,窗体身份验证)仅适用于ASP.NET应用程序或您已将脚本映射到由aspnet_isapi.dll处理的所有请求的应用程序。
在将生产环境升级到IIS 7及更高版本并将应用程序分配到集成模式下的应用程序池之前,请确保在集成模式下测试现有应用程序的兼容性。如果应用程序无法在集成模式下工作,则应该只在Classic模式下将应用程序添加到应用程序池。例如,您的应用程序可能依赖于从IIS传递到托管运行时的身份验证令牌,并且由于IIS 7及更高版本中的新架构,进程会中断您的应用程序。