我有这样的服务:
[ServiceContract(SessionMode = SessionMode.Required, CallbackContract=typeof(IMyServiceCallback))]
public interface IMyService
{
[OperationContract]
bool CallService();
}
public interface IMyServiceCallback
{
[OperationContract(IsOneWay = true)]
void NotifyClient();
}
在NotifyClient()的实现中,我尝试调用CallService()。这会导致InvalidOperationException:
附加信息:此操作将死锁,因为在当前消息完成处理之前无法接收回复。如果要允许无序消息处理,请在CallbackBehaviorAttribute上指定Remediate的ConcurrencyMode或Multiple。
我的服务的ServiceBehavior设置如下:
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession, ConcurrencyMode=ConcurrencyMode.Multiple, UseSynchronizationContext=false)]
我的回调将CallbackBehavior改为:
[CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext=false)]
可能导致此异常的原因是什么?我也尝试过使用ConcurrencyMode.Reentrant,但这并没有帮助。我能够通过在工作线程上调用CallService()来解决问题,但我仍然想知道导致异常的原因。
感谢。
编辑:添加[OperationContract(IsOneWay = true)],但问题仍然存在。
答案 0 :(得分:1)
尝试将回调中的operationcontract设置为
[OperationContract(IsOneWay = true)]
答案 1 :(得分:1)
您是否尝试在单独的线程上调用NotifyClient()回调?这应该避免任何可能的死锁。
public class Service : IMyService
{
public bool CallService()
{
IMyServiceCallback callback = OperationContext.Current.GetCallbackChannel<IMyServiceCallback>();
Task.Factory.StartNew((cb) => cb.NotifyClient(), callback);
}
}