私の WCF サービスは netTcpBinding を使用し、コールバック オブジェクトを持っています。
複数の同時クライアントにサービスを提供し、セッションを維持する必要があるため、サービスは次のように装飾されています
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple]
スレッドのデッドロックを回避するために、コールバック クラスは次のように装飾されています。
[CallbackBehavior(UseSynchronizationContext=false)]
SynchronizationContext
UIスレッドでメソッドを実行するために使用します。
問題は、チャネルが理由もなく閉じられる場合があることです (ICommunicationObject.Closing
イベントが発生します)。その後、後続のサービス呼び出しで例外が発生します。
トレース ファイルを見ると、最後のメッセージはコールバック コールですが、コールバック メソッドは呼び出されません。例外はありません。
いくつかのデバッグの後、これは同期操作の途中でコールバック呼び出しが行われた場合にのみ発生することがわかりました。手順は次のとおりです。
A
を使用したサービス メソッドへの呼び出しIsOneWay=true
B
を使用したサービス メソッドへの呼び出しIsOneWay=false
A
コールバック メソッドを呼び出しますが、B
まだ実行中です。
コールバックにはUseSynchronizationContext=false
.
単純なシナリオでは問題を再現できませんでした。単純なプロジェクトでこれらの手順を実行すると、正常に実行されます。
何が起こっているのか、または問題を特定する方法について何か考えはありますか?