nettcp DuplexChannelを使用したWCF自己ホストサービスがあります。サーバーでは、私は、クライアントの接続を切断するには、次を実行します。WCF:サーバーが私の接続を切断した場合のクライアント側の検出方法
((ICommunicationObject)client.CallbackChannel).Close();
これは正常に動作しますが、私はそれが切断されたことをクライアントに検出しますか?
InstanceContext callback = new InstanceContext(callbackImp);
callback.Closed += new EventHandler(callback_Closed);
と
((ICommunicationObject)Channel).Closed += new EventHandler(Channel_Closed);
をしかし、何も機能しません:
アイブ氏は、コールバックのInstanceContextおよびサーバーへのチャネルの両方で閉じられ、フォルト発生-イベントにフックアップ。私は通知されることはありません。この問題を回避するには、代わりにクライアント側からの切断をトリガーするメソッドをコールバックに持たせることです。しかし、私はむしろこのようにしません。私は特にサーバーがユーザーを切断するのを待たせたくない。
EDIT
私はちょうど私が真IsTerminating =が付いているサービス契約のメソッドを実行すると、クライアント側から切断することを実現:
[OperationContract(IsTerminating = true)]
void Disconnect();
が、私はそれはと考えましたコールバック契約で同じですか? ...奇妙な
EDIT
I私は私のコールバックに同じメソッドを追加しようと、それはビューのサーバー点からのコールバック・チャネルを終了しましたが、私はまだ、クライアント側に通知してしまったdidntのこれについていくつかの詳細が分かった:
サーバーがコールバック チャネルを中止し、障害が戻っ クライアントに移動し、クライアントの障害と我々は クライアント上では障害発生イベントを取得します。
サーバーがコールバック チャネルを閉じると、クライアントはクローズを発行するまで、まだ を開いています。
クライアントがチャネル を閉じると、Closedイベントが表示されます。
このステートメントによれば、Closeイベントは、サーバーからコールバックチャネルを閉じることによって引き起こされるのではなく、クライアントも閉じる必要があります。だから、コールバックの終了Disconnectメソッドでクライアント上でCloseを実行することができました。または、コールバックサーバー側でAbortメソッドを使用し、コールバックでDisconnectメソッドを使用してスキップすることもできます。私はどちらが正直に優しいかわからない。うーん。私は中止-アプローチと一緒に行った
EDIT
。それは最も論理的な方法のように思え、それは本当にうまくいく。クライアントはcallback-instancecontextのFaultedイベントで通知を受け取ります。ニース。
これを見て、私は同じ問題を抱えているhttp://stackoverflow.com/questions/3986347/wcf-duplex-retrieve-client-connection – Rev