2011-12-13 23 views
7

コールバック/デュプレックス通信チャネルを閉じる問題/質問があります。私は、取得するためにWCFコールバックインターフェイス - チャネルを閉じる人

OperationContext.Current.GetCallbackChannel<IMyInterfaceCallback>(); 

を使用して、サーバー側で

DuplexChannelFactory<IMyInterface> dcf = new DuplexChannelFactory<IMyInterface>(implOfIMyInterfaceCallback, customBinding, ea); 
IMyInterface myInterface = dcf.CreateChannel(); 

:私は介して、私のWCFインターフェイスを作成し、クライアント側で

[ServiceContract(CallbackContract = typeof(IMyInterfaceCallback))] 
public interface IMyInterface 
{ 
    [OperationContract] 
    void StartWork(); 
} 

public interface IMyInterfaceCallback 
{ 
    [OperationContract(IsOneWay = true)] 
    void WorkFeedback(); 
} 

:ここに は私のプロトタイプのWCFインターフェイスですコールバックポインタは、クライアントとの通信に使用できます。

私の質問は次のようになります。

  1. 通信チャネルを閉じる必要があります誰ですか?クライアントまたはサーバー
  2. どの通信オブジェクトを閉じる必要がありますか?元のインターフェイス(IMyInterface)またはコールバックインターフェイス(IMyInterfaceCallback)またはその両方。

サーバー側でコールバックインターフェイスを閉じようとしましたが、サーバーがそれ以上コールバックを実行しないことがわかっているときに、 しかし、コールバックインターフェイスでICommunicationObject :: Closeを使用すると、1分のブロック操作が発生しました。

私の考えでは、クライアントサイドで閉じることは適切な方法ではありません。クライアントは、さらに多くのコールバックがあるかどうかわからないためです。

ありがとうございました。 フランク

PS: DuplexChannelは、ボンネットの下にTCP接続を使用していますこれは非常に基本的な質問のようですが、Googleを介して、またはstackoverflowの中で検索するときに、これまで私は有益な情報を発見した...

答えて

3

それが双方向通信をエミュレートする方法です。しかし、クライアントは常にその接続を開いているので、TCPソケットを閉じても問題ありません(TCPソケットで考える)。したがって、クライアントインターフェイスIMyInterface(IClientChannelから派生)を使用して閉じます。

よろしくお願いいたします。 パブロ

6

クライアントは(通常どおり)サービスチャネルを閉じる必要があります。

GetCallbackChannelを通じて取得したコールバックチャンネルは私の経験ではクローズしないでください

(私のこの関連する質問を参照してください:Do I need to Close and/or Dispose callback channels acquired through OperationContext.Current.GetCallbackChannel?)を

あなたは好ましいパターンを使用する必要があり、チャネルクローズ:ので

Try 
    channel.Close() 
Catch ex As Exception 
    channel.Abort() 
End Try 

をクライアント(通常)は、チャネルをクローズしようとしている間にまだメッセージが進行中であるかどうかを知ることができず、例外が発生します。

+0

情報をいただきありがとうございます。私は現在、クライアント側のチャンネルを閉鎖しています。しかし、閉鎖する前に状態をチェックしています。 Faultedの場合はAbort()を直接呼び出します。しかし、クローズコードもうまくいくはずです。 – FrankE

関連する問題