WCF 请求响应生命周期

WCF request response lifecycle

我是 WCF 新手,想了解一些事情。

  1. 是否每个 request/response 都在单独的互斥 threads/process 主机中处理?同一个 thread/process 可以处理多个请求吗?是否涉及任何请求排队?

  2. 如果我有 global/static 个变量,它们的范围是否限于给定的请求响应序列?

提前致谢。

在 WCF 中,有三种方法用于服务对象的实例管理 - PerCallPerSessionSingle。此服务行为属性称为 InstanceContextMode.

PerCall - 在每次客户端方法调用时创建一个新的服务实例。如果您的服务是无状态的,则有效。

PerSession - 为每个新的客户端代理创建一个新的服务实例。如果您需要在来自同一客户端的调用之间保留状态信息,则可以使用。

Single - 创建一个在所有客户端之间共享的服务实例。如果您需要在整个服务中共享全球数据,则可以使用。

对于问题的线程部分,有一个称为 ConcurrencyMode 的服务行为属性,它处理每个服务实例的线程性质的细节。选项为 SingleMultipleReentrant

Single - 服务实例是单线程的。

Multiple - 服务实例是多线程的。您必须处理服务对象的同步和状态一致性。

Reentrant - 服务实例是单线程的,但服务在调用另一个服务时接受调用。这需要一些开销来维护服务对象的状态和处理服务的回调。

这两个因素结合起来控制您的服务实例的行为。例如,如果您将 InstanceContextModeConcurrencyMode 设置为 Single 并且您的服务在实例已在处理呼叫时收到新消息,则这些消息必须等到您的服务完成处理在处理下一条消息之前进行调用(在此期间消息可能会超时)。

就个人而言,除了单线程、每次调用服务实例之外,我从来没有真正需要任何东西。但是您的要求可能与我的有很大不同。

在 WCF 的 Instance Management and Concurrency 上链接了一些非常好的文章。