当ConcurrencyMode是Single时,我可以调用多个操作契约吗?



我有一个包含3个操作契约的WCF服务。我将此服务设置为[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single)]。我最基本的疑问是我能一次调用所有3个服务还是一次只能调用一个契约。

并发模式适用于实例上下文模式。如果您将ConcurrencyMode设置为Single,则只需告诉WCF每个服务实例只能处理一个并发请求- Single也是ConcurrencyMode的默认值。

除非你将InstanceContextMode配置为Single(=你将使你的服务单例),否则你的服务主机将为每个请求(无状态绑定,如BasicHttpBindingWebHttpBinding)或每个连接的代理(有状态绑定,如NetTcpBinding, NamedPipeBindingWsHttpBinding的一些配置)生成新的服务实例。在前一种情况下,ConcurrencyMode没有任何影响,因为每个服务实例仅用于处理单个请求=可以并发处理来自任意数量客户机的请求。在以后的情况下,ConcurrencyMode.Single告诉来自单个客户端代理的请求按顺序处理,但来自多个客户端代理的请求可以并发处理。每个公开的合约需要单独的端点,客户端上的每个消费端点需要单独的代理实例,因此在这种情况下,每个合约的代理将具有单独的服务实例。

在您当前的配置中,只有服务throttling控制有多少并发客户端可以使用您的服务。

一旦将InstanceContextMode设置为Single,您将确实拥有一次只能处理单个请求的服务。实现契约的数量并不重要,因为在这种情况下,在单个服务的端点中公开的所有契约都由单个服务实例处理,该实例只接受一个并发请求。