2010-11-30 29 views
16

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イベントで通知を受け取ります。ニース。

+0

これを見て、私は同じ問題を抱えているhttp://stackoverflow.com/questions/3986347/wcf-duplex-retrieve-client-connection – Rev

答えて

2

私は中止-アプローチと一緒に行きました。それは最も論理的な方法のように思え、それは本当にうまくいく。クライアントはcallback-instancecontextのFaultedイベントで通知を受け取ります。

1

コールバックを閉じると、クライアントにチャネルを終了していることを伝えるだけです。

は、だから、このコード行の前に:

((ICommunicationObject)client.CallbackChannel).Close(); 
+0

これは動作しませんかについていくつかの詳細を提供について – Sentry

+0

どのように動作しません。 ....コールバックチャンネルを使ってコードを実行しているソフトウェアがあるので、動くことは分かっています。 6年前と同じように正確な実装を思い出してはいけませんが、imhoはそれがうまくいかず、答えをdownvotingするのはちょっと幼稚だと言っています。 –

+0

質問の編集で説明されています。コールバックを閉じると、クライアントに通知されません。クライアントが障害イベントを受け取るように、それを中止する必要があります。 – Sentry

関連する問題