WCF如何处理服务器的多个客户端调用?

Osh*_*hin 3 wcf multithreading

想要清楚地了解WCF的工作方式。假设WCF服务公开了一个函数A。现在,客户端创建了5个线程,并且每个线程中的每个线程都使用不同的参数调用函数A。

我认为这应该发生-为该函数的每个线程调用都会创建一个新的函数A实例。有人可以确认这一点。我写了一个没有这样做的POC,结果不一致。

Jan*_*Jan 5

这取决于通过实现服务合同的类上的ServiceBehavior属性进行的服务配置:

[ServiceBehavior(
    InstanceContextMode = InstanceContextMode.PerSession, 
    ConcurrencyMode = ConcurrencyMode.Multiple)]
Run Code Online (Sandbox Code Playgroud)

使用该参数,InstanceContextMode您可以告诉WCF如何托管服务:

  • Single:将创建一个服务类实例,该实例将接收所有服务调用
  • PerSession:对于每个连接的客户端,将创建一个新实例
  • PerCall(默认):对于每个客户端的每次调用,都会创建一个新实例

接下来的事情是同步,当一个主机对象收到并行操作调用时。您可以使用ConcurrencyMode参数控制行为:

  • 单个(默认):WCF序列化所有操作,因此您的服务实例一次仅执行一个操作或不执行任何操作调用。
  • 可重入:WCF将所有操作调用直接委派给您的服务实例,但是将调用同步到服务操作内部的另一个WCF服务(我认为这是很少使用的)。
  • 多个:WCF直接将所有操作调用委派给您的服务实例,而无需同步。您必须自己担心同步。