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 に答える