【发布时间】:2010-12-17 22:28:24
【问题描述】:
我的 WCF 服务使用 netTcpBinding,并且有一个回调对象。
我需要为多个并发客户端提供服务,并维护会话,所以服务被装饰了
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple]
为了避免线程死锁,回调类被修饰为
[CallbackBehavior(UseSynchronizationContext=false)]
我使用SynchronizationContext 在 UI 线程中执行该方法。
问题是有时通道 gest 无缘无故关闭(ICommunicationObject.Closing 事件被触发)。之后,我在任何后续服务调用中都会遇到异常。
查看跟踪文件,最后一条消息是回调调用,但是,回调方法从未被调用。没有例外。
经过一些调试后,我发现只有在同步操作中间进行回调调用时才会发生这种情况。步骤如下:
- 使用
IsOneWay=true调用服务方法A - 调用服务方法
B和IsOneWay=false -
A调用回调方法,但B仍在执行中。
这应该不是问题,因为回调有UseSynchronizationContext=false,所以回调调用可以在单独的线程中处理。
我无法在更简单的场景中重现该问题。在一个简单的项目中按照这些步骤成功执行。
对可能发生的情况或如何识别问题有任何想法吗?
【问题讨论】:
-
code sn-ps 可以从客户端和服务端受益。
标签: wcf callback channel duplex