我正在研究WCF。我希望并发类型为多个,意味着每个请求都有多个线程。我已经在Service类实现中定义的方法和接口中的prototype define中设置了参数。我在服务中使用以下参数,如下所示
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple,
InstanceContextMode = InstanceContextMode.PerCall,
ReleaseServiceInstanceOnTransactionComplete = false,
TransactionIsolationLevel = System.Transactions.IsolationLevel.ReadCommitted)]
public class BusinessPartnerService : IBusinessPartnerService
现在,当我将服务上的任何方法从一个服务调用到另一个服务时,会抛出异常:
底层连接已关闭:服务器已关闭预期保持活动状态的连接。
我错过了一些配置还是其他什么?任何帮助将受到高度赞赏。
答案 0 :(得分:1)
ConcurrencyMode.Multiple
和InstanceContextMode.PerCall
一起使毫无意义。
InstanceContextMode.PerCall
表示每个请求都会获得服务类的自己的实例来处理请求 - 因此ConcurrencyMode.Multiple
完全没有意义,因为每个请求无论如何都有自己的服务类实例。
没有多线程/请求想要使用相同服务类实例的可能性 - 每个都有自己的实例。
在WCF中执行操作的首选方法是InstanceContextMode.PerCall
(每个请求都有自己的,独立的服务类实例来处理其工作)与ConcurrencyMode.Single
相结合(因为每个服务类实例都将无论如何只处理一个请求!)
ConcurrencyMode.Multiple
), InstanceContextMode.Single
才会有意义。然而,这会给你带来很多额外的努力 - 该服务类单例的实现必须是100%线程安全 - 这不是一件容易的事!