2012-03-28 10 views
0

サーバー側のイベントに基づいて(WcfDuplexChannelsを使用して)クライアント上でメソッドを再度呼び出す一連のWCFサービスがあります。しかし、かなりの例外が発生する可能性があるので、今すぐクライアントにコールバックするたびに大きなtry/catchブロックがあり、例外が発生した場合にイベントを無効にして終了します。 毎回書くのが面倒であるだけでなく、いくつかの基本的な例外をキャッチしてtry catchブロックを単純化できるかどうかはわかりません。今、私は本当に例外を引き起こしているものは気にしません(私はそれがフォルト、アボート、廃棄、タイムアウトしても気にしません)が、別の例外を記録します。WCFコールバックメソッドを呼び出すときの適切な例外処理

私はIErrorHandlerについても読んでいますが、実際にはクライアント上でメソッドを呼び出すときに適していますか?

は、ここに私の現在の戦略のサンプルです:

private void OnProductChanged(List<DTO> products) 
    { 
     try 
     { 
      client.OnProductChanged(products); 
      return; 
     } 
     catch (TimeoutException) 
     { 
      log.Info("Communication to client timed out."); 
     } 
     catch (CommunicationObjectAbortedException) 
     { 
      log.Info("Connection to client is in aborted state."); 
     } 
     catch (CommunicationObjectFaultedException) 
     { 
      log.Info("Connection to client is in faulted state."); 
     } 
     catch (CommunicationException ce) 
     { 
      log.InfoFormat("CommunicationException occured on product change notification: {0}.", ce.Message); 
     } 
     catch (ObjectDisposedException) 
     { 
      log.Info("Communication channel is disposed."); 
     } 
     catch (Exception e) 
     { 
      log.WarnFormat("Unhandled {0} on client callback: {1}", e.GetType(), e.Message); 
     } 

     SendProductChanged = false; 
    } 

SendProductChanged = false;ラインは、イベントハンドラをアンバインドの世話をします。

答えて

1

アクションとしてFuncsをパラメータとするラッパーメソッドを記述できます。この関数内でtry catchブロックを使用できます。この関数を使用して関数を呼び出すことができます。以下のようなもの:これは私の心を交差させた

CallMethod(() => client.OnProductChanged(products)); 
+0

public void CallMethod(Action methodToBeCalled) { try { methodToBeCalled(); } catch ..... .... } 

その後のようなあなたの関数を呼び出します。私は特に誰かが私の質問のIErrorHandlerの部分に反応する場合、私はあなたの答えはおそらくそれが得られるように良いと思う興味があります。ありがとう! – mycroes

+0

年後、私はこの質問を振り返ります。これは今私が今やっている方法です。キャッチが少し変更され、サービスが単一インスタンスに変更されました。そのため、一部の例外タイプが発生した場合、クライアントはクライアントのリストから削除されます。 – mycroes

関連する問題