2012-03-28 102 views
0

我有一系列的WCF服務,它們根據服務器端的事件再次調用客戶端上的方法(使用WcfDuplexChannels)。但是,似乎有一些可能會發生的異常,所以現在我在每一行回調客戶端都有一個巨大的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 Actions作爲參數的包裝方法,並且您可以在此函數中使用try catch塊。你可以使用這個函數調用你的函數;是這樣的:

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

然後打電話給你的功能,如:

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

這已經跨越了我的腦海裏。我特別感興趣的是,如果有人會對我的問題的IErrorHandler部分做出反應,否則我認爲您的答案可能會達到最佳效果。謝謝! – mycroes 2012-03-28 11:57:25

+0

多年後,我回頭看這個問題,這正是我現在這樣做的方式。捕獲已經發生了一些變化,我的服務已經更改爲單實例,所以如果發生某些異常類型,客戶端將從客戶端列表中刪除。 – mycroes 2017-09-15 12:10:10