【问题标题】:Connection fail when WCF Concurrency Mode set to multiple当 WCF 并发模式设置为多个时连接失败
【发布时间】:2014-09-23 06:08:44
【问题描述】:

我正在研究 WCF。我想要多个并发类型,意味着每个请求都有多个线程。我已经在服务类实现中定义的方法和接口中定义的原型上设置了参数。我在服务上使用以下参数,如下所示

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple,
    InstanceContextMode = InstanceContextMode.PerCall,
    ReleaseServiceInstanceOnTransactionComplete = false,
    TransactionIsolationLevel = System.Transactions.IsolationLevel.ReadCommitted)]
    public class BusinessPartnerService : IBusinessPartnerService

现在,当我从一个服务调用我的服务上的任何方法到另一个服务时,就会引发异常:

底层连接已关闭:预期保持活动状态的连接已被服务器关闭。

我是否缺少某些配置或其他内容?任何帮助将不胜感激。

【问题讨论】:

  • 你在使用SoapUI之类的工具吗?它可能仅取决于客户端配置。

标签: .net web-services wcf c#-4.0 concurrency


【解决方案1】:

ConcurrencyMode.MultipleInstanceContextMode.PerCall 在一起没有意义

InstanceContextMode.PerCall 意味着每个请求都将获得其自己的服务类实例来处理请求 - 因此,ConcurrencyMode.Multiple 完全没有意义,因为每个请求都有自己的实例无论如何都是服务类的。

没有多个线程/请求想要使用同一个服务类实例的可能性 - 每个都有自己的实例。

在 WCF 中做事的首选方式是InstanceContextMode.PerCall(每个请求都有自己的、单独的服务类实例来处理其工作)结合ConcurrencyMode.Single(因为每个服务类实例只会处理一个无论如何都是一个请求!)

ConcurrencyMode.Multiple 只有在你有一个需要同时处理多个请求的单例服务类 (InstanceContextMode.Single) 时才有意义。然而,这会给您带来很多额外的工作 - 该服务类单例的实现必须是 100% 线程安全的 - 这不是一件容易的事!

【讨论】:

  • 那么 InstanceContextMode.PerSession 呢。那是怎么回事?在那种情况下它不会正常工作吗?
  • @NomiAli: per-session 的意思是:第一次调用获得一个全新的服务类实例,随后的每个调用都将获得相同的实例 - 但同样:每个 请求有它自己的服务类实例 - 绝对不需要ConcurrencyMode.Multiple!
  • 这意味着如果我想实现多个服务的并发,不同的线程同时工作,我需要使用 Single InstanceContextMode 并针对它编写代码?
  • 非常感谢任何有用的链接。
  • 兄弟,这令人困惑,您说首选方式是 PerCall 和并发模式单一。在 percall 中,每个请求都会创建自己的服务类的单独实例,并且单个并发模式永远不会起作用,因为每个请求都会获得自己的服务对象。现在如果请求来自另一个客户端,并发会实现吗?为什么我们不使用具有多个并发的 PerSession,因为每个客户端都获得了将处理同一客户端的所有请求的会话。如果另一个客户提出服务请求怎么办?
猜你喜欢
  • 2017-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-26
  • 2021-04-07
  • 1970-01-01
  • 2015-01-31
  • 1970-01-01
相关资源
最近更新 更多