2011-07-31 2 views
0

実践:WCFクローズ最高の私は、WCFプロキシを使用するためのベストプラクティスがあろうと読ん

YourClientProxy clientProxy = new YourClientProxy(); 

try 
{ 
    .. use your service 
    clientProxy.Close(); 
} 
catch(FaultException) 
{ 
    clientProxy.Abort(); 
} 
catch(CommunicationException) 
{ 
    clientProxy.Abort(); 
} 
catch (TimeoutException) 
{ 
    clientProxy.Abort(); 
} 

私の問題は、私は私のプロキシを割り当てた後、私はそれにイベントハンドラを割り当て、また、使用して他の方法を初期化し、ありますプロキシ:

public void InitProxy() 
{ 
    sdksvc = new SdkServiceClient(); 
    sdksvc.InitClusteringObjectCompleted += new EventHandler<InitClusteringObjectCompletedEventArgs>(sdksvc_InitClusteringObjectCompleted); 
    sdksvc.InitClusteringObjectAsync(Utils.DSN, Utils.USER,Utils.PASSWORD); 
    sdksvc.DoClusteringCompleted += new EventHandler<DoClusteringCompletedEventArgs>(sdksvc_DoClusteringCompleted); 
    sdksvc.CreateTablesCompleted += new EventHandler<CreateTablesCompletedEventArgs>(sdksvc_CreateTablesCompleted); 
} 

私は今InitProxy()メソッドに私はベストプラクティスが示唆するように、それを使用したい場合、私はプロキシを使用するたびに呼び出す必要があります。

これを回避する方法についてのご意見はありますか?

+0

WCFサービスを呼び出すたびに '.Close()'を呼び出す必要はありません。エラーがなければ、別の呼び出しのために再びそのプロキシを使用することは間違いありません。このベストプラクティスについてのポイントは、あなたのWCFプロキシ呼び出しを 'using(....){....}'ブロックに入れてはいけないということです。なぜならそのブロックはプロキシを終了 '}' WCFプロキシが例外を発生させる可能性があります。この例外は、使用ブロックに気づかれません。 –

+0

[WCFクライアントの\\使用ブロック問題の最善の回避策は何ですか?](http://stackoverflow.com/questions/573872/what-is-the-best-workaround-for-the- wcf-client-using-block-issue) –

答えて

0

いくつかのオプションがあります。 1つのオプションは、次のようにヘルパークラスを作成することです:

public class SvcClient : IDisposable { 
    public SvcClient(ICommunicationObject service) { 
     if(service == null) { 
     throw ArgumentNullException("service"); 
     } 
     _service = service; 
     // Add your event handlers here, e.g. using your example: 
     sdksvc = new SdkServiceClient(); 
     sdksvc.InitClusteringObjectCompleted += new EventHandler<InitClusteringObjectCompletedEventArgs>(sdksvc_InitClusteringObjectCompleted); 
     sdksvc.InitClusteringObjectAsync(Utils.DSN, Utils.USER,Utils.PASSWORD); 
     sdksvc.DoClusteringCompleted += new EventHandler<DoClusteringCompletedEventArgs>(sdksvc_DoClusteringCompleted); 
     sdksvc.CreateTablesCompleted += new EventHandler<CreateTablesCompletedEventArgs>(sdksvc_CreateTablesCompleted); 
    } 
    public void Dispose() { 
     try { 
     if(_service.State == CommunicationState.Faulted) { 
      _service.Abort(); 
     } 
     } 
     finally { 
     _service.Close(); 
     } 
    } 
    private readonly ICommunicationObject _service; 
} 

次のことを書き、このクラスを使用するには:SvcClientのコンストラクタが呼び出されたときに、必要に応じて

var clientProxy = new YourClientProxy(); 
using(new SvcClient(clientProxy)) { 
    // use clientProxy as usual. No need to call Abort() and/or Close() here. 
} 

それはその後SdkServiceClientインスタンスを設定します。さらに、SvcClientクラスはサービスクライアントプロキシをクリーンアップし、制御フローがusing -blockからどのように離れるかにかかわらず、必要に応じて接続を中断または閉じることができます。

0

ClientProxyとInitProxy()がどのようにリンクされているのかわかりませんが、これが強くリンクされている場合は、ClientProxyの初期化をInitProxyに移す(または両方を初期化するメソッドを作成する)彼らの両方のライフスパンをそこからコントロールする。

関連する問題