2011-08-15 18 views
2

にコールバックするとき、私はこのようなサービスがあります。NotifyClient(の実装でWCF InvalidOperationExceptionがコールバック

[ServiceContract(SessionMode = SessionMode.Required, CallbackContract=typeof(IMyServiceCallback))] 
public interface IMyService 
{ 
    [OperationContract] 
    bool CallService(); 
} 

public interface IMyServiceCallback 
{ 
    [OperationContract(IsOneWay = true)] 
    void NotifyClient(); 
} 

を)私はCallService(への呼び出しを試みます)。これにより、InvalidOperationExceptionが発生します。

追加情報:この操作は、現在のメッセージが処理を完了するまで受信できないため、デッドロックになります。アウトオブオーダーのメッセージ処理を許可する場合は、ConcurrencyModeをReentrant、またはMultipleをCallbackBehaviorAttributeに指定します。

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

を、私のコールバックとしてCallbackBehaviorがあります:この例外を発生させたことができるもの

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

次のように

は私のサービスはServiceBehaviorが設定されていますか?私もConcurrencyMode.Reentrantを使ってみましたが、それは役に立ちません。私は、ワーカースレッドでCallService()を呼び出すことによって問題を解決することができますが、私はまだ例外の原因を知りたいと思います。

ありがとうございました。

編集:[OperationContract(IsOneWay = true)]が追加されましたが、問題は残ります。

答えて

1

[OperationContract(IsOneWay = true)] 
+0

私もこれを試しましたが、役に立たないです。 (私は私の記述にそれを含めるべきだった...)。 – MrNick

+0

NotifyClientとCallServiceの実装を投稿できますか? – Dominik

+0

通知クライアントは、proxy.CallService()を呼び出す以外は何もしません。また、CallSericveメソッドには例外が発生するために何も含める必要はありません。私が作成したプロキシは、DuplexClientBase から派生しています。私は別のtheradでCallServiceを呼び出すことによって問題を克服することができたので、私は当面はそれ以上調べるつもりはない。あなたの助けをありがとう! – MrNick

1

にコールバックにoperationcontractを設定してみてください、あなたは別のスレッドでNotifyClient()コールバックを呼び出してみましたか?デッドロックが発生しないようにする必要があります。

public class Service : IMyService 
{ 
    public bool CallService() 
    { 
      IMyServiceCallback callback = OperationContext.Current.GetCallbackChannel<IMyServiceCallback>(); 
      Task.Factory.StartNew((cb) => cb.NotifyClient(), callback); 
    } 
} 
関連する問題