我有一个包含3个操作契约的WCF服务。我将此服务设置为[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single)]
。我最基本的疑问是我能一次调用所有3个服务还是一次只能调用一个契约。
并发模式适用于实例上下文模式。如果您将ConcurrencyMode
设置为Single
,则只需告诉WCF每个服务实例只能处理一个并发请求- Single
也是ConcurrencyMode
的默认值。
除非你将InstanceContextMode
配置为Single
(=你将使你的服务单例),否则你的服务主机将为每个请求(无状态绑定,如BasicHttpBinding
或WebHttpBinding
)或每个连接的代理(有状态绑定,如NetTcpBinding
, NamedPipeBinding
和WsHttpBinding
的一些配置)生成新的服务实例。在前一种情况下,ConcurrencyMode
没有任何影响,因为每个服务实例仅用于处理单个请求=可以并发处理来自任意数量客户机的请求。在以后的情况下,ConcurrencyMode.Single
告诉来自单个客户端代理的请求按顺序处理,但来自多个客户端代理的请求可以并发处理。每个公开的合约需要单独的端点,客户端上的每个消费端点需要单独的代理实例,因此在这种情况下,每个合约的代理将具有单独的服务实例。
在您当前的配置中,只有服务throttling控制有多少并发客户端可以使用您的服务。
一旦将InstanceContextMode
设置为Single
,您将确实拥有一次只能处理单个请求的服务。实现契约的数量并不重要,因为在这种情况下,在单个服务的端点中公开的所有契约都由单个服务实例处理,该实例只接受一个并发请求。