IIS 中如何处理 WCF 请求

How WCF request is handled in IIS

我正在从事一个提高 WCF 服务性能的项目。我们在 IIS 服务器上托管了 WCF 服务。 我浏览了各种文章以了解从 WCF 客户端到 WCF 服务请求处理的端到端流程。

请澄清以下问题:

  1. 当 WCF 请求来自客户端时,IIS 会发生什么情况?
  2. IIS 如何识别请求是针对特定 WCF 服务的(假设 IIS 中托管了多个 WCF 服务)?
  3. IIS 如何将请求处理委托给 WCF 服务?
  4. 谁负责创建 WCF 服务实例?
  5. ASP.Net工作线程如何进入WCF服务处理请求?
  6. 应用程序池设置在 WCF 服务请求处理中的作用是什么?

对托管在 IIS 上的 WCF 服务的请求由 WAS(Windows 激活服务)处理,它将激活体系结构与 IIS 分离。 WAS 负责处理 WCF 服务的请求/响应。

以下是当针对托管在 WAS 上的 WCF 服务的 http 请求到达时发生的高级情况

  • 请求首先由 http.sys 内核接收。
  • 一个新的 WAS 服务负责配置应用程序池, 除其他事项外。
  • WWW 服务负责激活应用程序池和 请求队列来处理传入的请求。此外,这 服务有一个新的 HTTP Listener Adapter 将请求转发到 HttpHandler 来处理请求(不需要 aspnet_isapi.dll).

牢记以上几点,以下是我能想到的最佳答案。

假设您的 WCF 服务正在侦听 HTTP 协议

1.当 WCF 请求来自客户端时,IIS 会发生什么?

一切都发生在 WAS 而不是 IIS 中。

当协议侦听器 (HTTP.sys) 接收到客户端请求时,WAS 会确定工作进程是否处于 运行ning 状态。如果应用程序池已经有一个正在为请求提供服务的工作进程,侦听器适配器会将请求传递给工作进程进行处理。如果应用程序池中没有worker进程,WAS会启动一个worker进程,以便监听适配器将请求传递给它处理。

侦听器适配器是 WAS 的一部分。然后请求流入工作进程(w3wp.exe 由 WAS 激活)应用程序域,该应用程序域具有处理此请求的 HTTP 模块和 HTTP 处理程序(不需要 aspnet_isapi.dll)。

2。 IIS 如何识别请求是针对特定 WCF 服务的(假设 IIS 中托管了多个 WCF 服务)?

创建工作进程实例 (w3wp.exe) 并加载应用程序代码以及该工作进程中的其他组件/网络协议的不是 IIS,而是 WAS。传入请求的终结点地址包含 WCF 服务名称。 SOAP 消息还包含客户端调用的方法和服务 (class) 名称。 Channel DispatchersEndpoint Dispatchers 使用此信息激活 class 实例并调用目标方法。

Channel and Endpoint Dispatchers

3。 IIS 如何将请求处理委托给 WCF 服务?

它的 WAS 再次将请求委托给特定的 WCF 服务,它在请求进入时识别该服务。

4.谁负责创建 WCF 服务实例?

调度器负责接受新通道、接收消息、操作调度和调用,以及响应处理。问题 # 2 的答案描述了这一点。

5. ASP.Net 工作线程如何进入 WCF 服务处理请求?

在 IIS 7 及更高版本中,Windows进程激活服务 (WAS) 代替 WWW 管理应用程序池配置和工作进程 Service.It 管理 HTTP 和非HTTP 请求。

HTTP 侦听器适配器负责桥接 WAS 和 ASP.Net 工作进程之间的请求。对于 HTTP 请求,适配器由 www 服务 (w3svc) 提供。

6.应用程序池设置在 WCF 服务请求处理中的作用是什么?

应用程序池中的所有应用程序共享一组共同的 运行 时间特征。例如,它们都 运行 在相同版本的通用语言 运行time (CLR) 下,并且它们都共享一个共同的进程标识。每个应用程序池对应一个工作进程实例 (w3wp.exe)。共享应用程序池中的每个托管应用程序 运行 都通过 CLR AppDomain 与其他应用程序隔离。

请求到达 ServiceHost 进程后,WCF 通道调度程序将其拾取并转发给特定的端点调度程序,后者会调用负责处理请求的方法(端点)。

参考文献:

  1. 学习 WCF:Michele Leroux Bustamante 的实践指南
  2. http://devproconnections.com/net-framework/iis-and-was-hosting-architecture
  3. https://msdn.microsoft.com/en-us/library/ms734677(v=vs.110).aspx
  4. https://msdn.microsoft.com/en-us/library/ms789006(v=vs.110).aspx
  5. https://msdn.microsoft.com/en-us/library/ms734665.aspx
  6. https://www.iis.net/learn/get-started/introduction-to-iis/introduction-to-iis-architecture#WAS