我想得到一个概览 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。当WAS服务启动一个新的工作进程时,sys将请求排在内核模式请求队列中。然后,这个工作进程自己从内核模式队列中获取请求。第2点:"Windows进程激活服务(WAS)"章节下的"进程管理"小节如下。
WAS为HTTP和非HTTP请求管理应用程序池和工作进程。当协议侦听器接收到客户端请求时,WAS确定工作进程是否正在运行。如果应用程序池已经有一个为请求提供服务的工作进程,则侦听器适配器将请求传递给工作进程进行处理。如果应用程序池中没有工作进程,WAS将启动一个工作进程,以便侦听器适配器可以将请求传递给它进行处理。
根据这一点,我的结论如下:HTTP。sys"通过WWW服务"将请求转发给工作进程,因为它是侦听器适配器。如果没有工作进程可用,则使用HTTP。当WAS服务启动一个新的工作进程时,sys将请求排在内核模式请求队列中。来自内核模式队列的请求随后被WWW服务接收并转发给工作进程。 谁能告诉我以上两个结论哪一个是正确的?如果两者都不正确,请告诉我正确的流程。我认为两者都不对。我也试图找出确切的工作原理,最后找到了HTTP服务器API, https://learn.microsoft.com/en-us/windows/desktop/http/http-version-2-0-architecture.
"HTTP。sys"通过WWW服务"将请求转发给工作进程,因为它是侦听器适配器。从上面的文档和这里https://learn.microsoft.com/en-us/windows/desktop/http/process-isolation,您可以看到HTTP内核模式(HTTP .sys)将请求路由到与url关联的队列。当在iis mgr中创建应用程序池时,队列将被配置,当您在iis mgr中创建网站并将网站绑定到池时,url将与队列相关联。http。Sys把东西放到队列中。app pool进程处理队列中的东西。http之间没有直接的交互。系统和工作进程。
"如果没有工作进程可用,…"从上面的进程隔离文档来看,这也是不正确的:
创建程序或控制器进程:控制器进程可以使用或不使用管理权限运行,以监视运行状况和配置服务。控制器进程通常为服务创建单个服务器会话,并在服务器会话下定义URL组。与特定URL相关联的URL组确定哪个请求队列服务由特定URL表示的名称空间。控制器进程还创建请求队列,并启动可以访问请求队列的工作进程。工作进程:由控制器进程启动的工作进程对与其所服务的url相关联的请求队列执行IO。创建请求队列时,ACL中的控制器进程授予web应用程序对请求队列的访问权限。除非web应用程序也是创建者进程,否则它不会管理服务或配置请求队列。控制器进程将请求队列的名称传递给工作进程,工作进程通过名称打开请求队列。工作进程可以加载第三方web应用程序,而不会在应用程序的其他部分引入安全漏洞。
所以控制器进程将创建工作者。毫无疑问,这就是WAS,确切地说,它是如何检测何时创建一个进程的,没有定义,但它肯定是上面提到的"控制器进程"。
有趣的是,在asp.net core中,你可以在http之上运行你的应用程序。sys, Microsoft.AspNetCore.Server.HttpSys。在内部,它使用这个api来配置东西。https://github.com/aspnet/HttpSysServer/blob/master/src/Microsoft.AspNetCore.Server.HttpSys/NativeInterop/HttpApi.cs。这个文档为我澄清了很多困惑。