【问题标题】:Multiple method call using same client instance to WCF service使用同一客户端实例对 WCF 服务进行多个方法调用
【发布时间】:2018-07-16 14:11:23
【问题描述】:

我的 WPF 应用程序正在使用单个客户端对象调用 WCF 服务。当发送请求并且在下一个请求之前立即响应时,这可以正常工作。

当我发送第一个请求时,需要 3 分钟才能完成计算任务并返回结果。同时从我的 WPF 应用程序发送第二个请求(每 3 秒发送一次 ping 请求)。此时,我收到以下错误并且 WPF 应用程序断开连接:

服务器没有提供有意义的回复:这可能是由于合同不匹配、会话过早关闭或内部服务器错误引起的

通信对象 System.ServiceModel.Channels.ServiceChannel 无法用于通信,因为它处于故障状态。

我的服务行为写如下:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, IncludeExceptionDetailInFaults=true)]

我尝试了不同的组合,但它不起作用。

【问题讨论】:

  • “我的 WPF 应用程序正在使用单个客户端对象调用 WCF 服务。”我猜您是在需要更改此设置时才发现的。为每个通话创建一个。
  • 我尝试了 PerCall,并发模式为 Multiple。第一次连接 WCF 服务时它正在抛出。是否希望我将并发模式保持为单一模式并重试?
  • 我的意思是您需要为每个要拨打的电话创建一个客户端实例。
  • 是的,我想到了。但问题是,它已经是现有的应用程序,我正在为此添加一个新功能。我无法改变无处不在。这个不允许。另外,它有回调,不同的线程调用WCF服务(ping线程)等。还有其他方法吗?

标签: wcf wcf-client nettcpbinding


【解决方案1】:

如果您从单个客户端执行多个并发调用,除了 InstanceContextMode 之外,您还应该将 ConcurrencyMode 设置为 Multiple .. 请注意,如果您将 InstanceContextMode 设置为 Single,您的服务将充当单例,那么您应该注意操作变量,因为它会反映其他调用..

【讨论】:

  • 是的,我有多个并发调用单个客户端。我还尝试将 InstanceContextMode 作为 Single 和 ConcurrenyMode 作为 Multiple。但是,我只使用 ServiceManager 类中的一个服务客户端对象来调用服务。它仍然让 WPF 应用程序断开连接。
【解决方案2】:

您的 Ping 请求不应使用相同的频道。它应该打开它自己的频道。理想情况下,每个独立的请求都应该打开它自己的通道(或者,您可以构建一个排队系统)。但是从两个不同的线程访问同一个通道是行不通的。

【讨论】:

    猜你喜欢
    • 2014-01-12
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 2012-09-17
    相关资源
    最近更新 更多