HTTP.sys如何向工作进程转发请求

时间:2015-08-21 17:57:51

标签: iis iis-7 was http.sys

我希望获得HTTP.sys转发请求到IIS 7.0及更高版本中的工作进程的概述。为此,我在http://www.iis.net/learn/get-started/introduction-to-iis/introduction-to-iis-architecture阅读了这篇文章。但是,这篇文章中有两点似乎是矛盾的,让我感到困惑。

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

内核模式请求排队。请求导致上下文切换的开销减少,因为内核将请求直接转发给正确的工作进程。如果没有工作进程可用于接受请求,则内核模式请求队列将保留请求,直到工作进程选择它为止。

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

第2点“Windows进程激活服务(WAS)”部分下的“进程管理”小节如下所示。

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

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

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

1 个答案:

答案 0 :(得分:0)

我认为这都不对。我还试图找出确切的工作原理,最后找到了HTTP Server API https://docs.microsoft.com/en-us/windows/desktop/http/http-version-2-0-architecture

“ HTTP.sys将请求“通过WWW服务”转发到工作进程,因为它是侦听器适配器。” 从上面的文档以及此处的https://docs.microsoft.com/en-us/windows/desktop/http/process-isolation中,您可以看到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核心中的http.sys,Microsoft.AspNetCore.Server.HttpSys之上运行您的应用程序。在内部,它使用此api进行配置。 https://github.com/aspnet/HttpSysServer/blob/master/src/Microsoft.AspNetCore.Server.HttpSys/NativeInterop/HttpApi.cs

此文档为我消除了很多困惑。希望对您有所帮助。