Iis HTTP.sys如何将请求转发到工作进程

Iis HTTP.sys如何将请求转发到工作进程,iis,iis-7,was,http.sys,Iis,Iis 7,Was,Http.sys,我想了解一下在IIS 7.0及更高版本中HTTP.sys将请求转发到工作进程的方式。为此,我在上读了这篇文章。然而,这篇文章中有两点似乎相互矛盾,让我困惑 第1点:在“超文本传输协议栈(HTTP.sys)”一节中提到的第二个要点如下 内核模式请求队列。由于内核将请求直接转发到正确的工作进程,因此请求在上下文切换中会导致较少的开销。如果没有工作进程可以接受请求,内核模式请求队列将保留该请求,直到工作进程接收该请求 根据这一点,我的结论如下: HTTP.sys绕过WWW服务将请求“直接”转发给工作进

我想了解一下在IIS 7.0及更高版本中HTTP.sys将请求转发到工作进程的方式。为此,我在上读了这篇文章。然而,这篇文章中有两点似乎相互矛盾,让我困惑

第1点:在“超文本传输协议栈(HTTP.sys)”一节中提到的第二个要点如下

内核模式请求队列。由于内核将请求直接转发到正确的工作进程,因此请求在上下文切换中会导致较少的开销。如果没有工作进程可以接受请求,内核模式请求队列将保留该请求,直到工作进程接收该请求

根据这一点,我的结论如下: HTTP.sys绕过WWW服务将请求“直接”转发给工作进程。如果没有工作进程可用,HTTP.sys会在WAS服务启动新的工作进程时,在内核模式请求队列中对请求进行排队。然后,这个工作进程自己从内核模式队列中拾取请求

第2点:“Windows Process Activation Service(WAS)”一节下的流程管理小节如下所示

WAS管理HTTP和非HTTP请求的应用程序池和工作进程。当协议侦听器拾取客户端请求时,WAS确定工作进程是否正在运行。如果应用程序池已经有一个为请求提供服务的工作进程,则侦听器适配器将请求传递给工作进程进行处理。如果应用程序池中没有工作进程,WAS将启动一个工作进程,以便侦听器适配器可以将请求传递给它进行处理

根据这一点,我的结论如下: HTTP.sys“通过WWW服务”将请求转发给工作进程,因为它是侦听器适配器。如果没有工作进程可用,HTTP.sys会在WAS服务启动新的工作进程时,在内核模式请求队列中对请求进行排队。然后,来自内核模式队列的请求被WWW服务拾取并转发到工作进程


有人能告诉我以上两个结论中哪一个是正确的吗?如果两者都不正确,请告诉我正确的流程。

我认为两者都不正确。我还试图找出确切的工作原理,最终找到了HTTP服务器API

“HTTP.sys通过WWW服务”将请求转发给工作进程,因为这是侦听器适配器。”从上面的文档中,您可以看到HTTP内核模式(HTTP.sys)将请求路由到与URL关联的队列。当在iis mgr中创建应用程序池时,将配置队列,当您在iis mgr中创建网站并将网站绑定到池时,URL将与队列关联。http.sys将内容放入队列。应用程序池进程处理队列中的内容。http.sys和工作进程之间没有直接交互

“如果没有工作进程可用,…”从上面的进程隔离文档中也看不到这一点:

创建者或控制器进程:控制器进程可以使用或不使用管理权限运行,以监视运行状况并配置服务。控制器进程通常为服务创建单个服务器会话,并在服务器会话下定义URL组。与特定URL关联的URL组确定哪个请求队列为特定URL表示的命名空间提供服务。控制器进程还创建请求队列,并启动可以访问请求队列的工作进程。 工作进程:由控制器进程启动的工作进程在与它们所服务的URL关联的请求队列上执行IO。创建请求队列时,ACL中的控制器进程授予web应用程序访问请求队列的权限。除非web应用程序也是创建者进程,否则它不会管理服务或配置请求队列。控制器进程将请求队列的名称传递给工作进程,工作进程按名称打开请求队列。工作进程可以加载第三方web应用程序,而不会在应用程序的其他部分引入安全漏洞

因此,控制器进程将创建工人。毫无疑问,这是WAS,确切地说它是如何检测何时创建流程的还没有定义,但它肯定是上面提到的“控制器流程”

有趣的是,在asp.net core中,您可以在http.sys、Microsoft.AspNetCore.Server.HttpSys上运行应用程序。Interntally它使用这个api来配置东西


这份文件为我澄清了许多困惑。我希望这能有所帮助。

我正在努力回答同样的问题,但我想我已经找到了一个解释。(但我不能100%肯定这一点)