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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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服务获取并转发到工作进程。

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

答案

我认为两者都不正确。我还试图找出确切的工作方式,最后找到了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和工作进程之间没有直接的交互。

“如果没有可用的工作进程,......”从上面的Process Isolation文档来看,这不是真的:

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

因此控制器进程将创建工作者。这毫无疑问是WAS,它究竟是如何检测何时创建一个进程没有定义,但它绝对是上面所说的“控制器进程”。

有趣的是,在asp.net核心中,您可以在http.sys,Microsoft.AspNetCore.Server.HttpSys上运行您的应用程序。在Interntally它使用这个api来配置东西。 https://github.com/aspnet/HttpSysServer/blob/master/src/Microsoft.AspNetCore.Server.HttpSys/NativeInterop/HttpApi.cs

这份文件给我带来了很多困惑。我希望它有所帮助。

以上是关于HTTP.sys如何向工作进程转发请求的主要内容,如果未能解决你的问题,请参考以下文章

请求转发和请求重定向

SpringSecurity:认证成功后如何继续向 RestController 转发请求?

压力测试报出503错误---ASP.NET支持大并发的相关配置

nginx架构

重定向和请求转发的区别

zeromq:如何防止无限等待?