在回调中回调时WCF InvalidOperationException

时间:2011-08-15 13:46:37

标签: c# wpf callback invalidoperationexception

我有这样的服务:

[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)],但问题仍然存在。

2 个答案:

答案 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);
     }
}