2

我有这样的服务:

[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 上指定 Reentrant 或 Multiple 的 ConcurrencyMode。

我的服务的 ServiceBehavior 设置如下:

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession, ConcurrencyMode=ConcurrencyMode.Multiple, UseSynchronizationContext=false)]

我的回调有 CallbackBehavior 为:

[CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext=false)]

什么可能导致此异常?我也尝试过使用 ConcurrencyMode.Reentrant,但这没有帮助。我可以通过在工作线程上调用 CallService() 来解决问题,但我仍然想知道是什么导致了异常。

谢谢。

编辑:添加了 [OperationContract(IsOneWay = true)],但问题仍然存在。

4

2 回答 2

1

尝试将回调上的 operationcontract 设置为

[OperationContract(IsOneWay = true)]
于 2011-08-15T14:34:54.233 回答
1

您是否尝试过在单独的线程上调用 NotifyClient() 回调?这应该避免任何可能的死锁。

public class Service : IMyService
{
     public bool CallService()
     {
           IMyServiceCallback callback = OperationContext.Current.GetCallbackChannel<IMyServiceCallback>();
           Task.Factory.StartNew((cb) => cb.NotifyClient(), callback);
     }
}
于 2012-10-28T07:44:31.250 回答