我的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事件被触发).之后,我在任何后续服务调用中都会遇到异常.
查看跟踪文件,最后一条消息是回调调用,但是,永远不会调用回调方法.没有例外.
经过一些调试后,我发现只有在同步操作过程中进行回调调用时才会发生这种情况.步骤如下:
A与IsOneWay=trueB与IsOneWay=falseA调用回调方法,但B仍在执行.这不应该是一个问题,因为回调有UseSynchronizationContext=false,所以回调调用可以在一个单独的线程中进行.
我无法在更简单的场景中重现问题.在一个简单的项目中执行这些步骤成功执行.
知道可能发生的事情或如何识别问题?
ale*_*dej 10
我认为可能发生的是客户端故障通道,因为它在收到回复消息时收到了回调消息.在带有net.tcp的WCF中,回调和回复使用相同的通道.
通常,您不应该在请求/回复(IsOneWay = false)OperationContract方法的主体内调用回调方法.最安全的事情是在进行双工时你的合同中没有任何请求/回复方法,但只要他们在返回之前不回调回回合同,你就可以安全地拥有它们.(可以在返回后调用回调方法,例如从另一个工作线程调用).
| 归档时间: |
|
| 查看次数: |
4419 次 |
| 最近记录: |