使用回调时,WCF双工通道将关闭

1 wcf duplex channel callback

我的WCF服务使用netTcpBinding,并有一个回调对象.

我需要服务多个并发客户端,并保持会话,所以服务装饰

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple]
Run Code Online (Sandbox Code Playgroud)

为了避免线程死锁,回调类被装饰

[CallbackBehavior(UseSynchronizationContext=false)]
Run Code Online (Sandbox Code Playgroud)

我用来SynchronizationContext在UI线程中执行该方法.

问题是有时候通道关闭没有任何理由(ICommunicationObject.Closing事件被触发).之后,我在任何后续服务调用中都会遇到异常.

查看跟踪文件,最后一条消息是回调调用,但是,永远不会调用回调方法.没有例外.

经过一些调试后,我发现只有在同步操作过程中进行回调调用时才会发生这种情况.步骤如下:

  1. 调用服务方法AIsOneWay=true
  2. 调用服务方法BIsOneWay=false
  3. A调用回调方法,但B仍在执行.

这不应该是一个问题,因为回调有UseSynchronizationContext=false,所以回调调用可以在一个单独的线程中进行.

我无法在更简单的场景中重现问题.在一个简单的项目中执行这些步骤成功执行.

知道可能发生的事情或如何识别问题?

ale*_*dej 10

我认为可能发生的是客户端故障通道,因为它在收到回复消息时收到了回调消息.在带有net.tcp的WCF中,回调和回复使用相同的通道.

通常,您不应该在请求/回复(IsOneWay = false)OperationContract方法的主体内调用回调方法.最安全的事情是在进行双工时你的合同中没有任何请求/回复方法,但只要他们在返回之前不回调回回合同,你就可以安全地拥有它们.(可以返回调用回调方法,例如从另一个工作线程调用).