2012-01-30 66 views
4

我正在通過httpwebrequest調用Web服務並獲取響應。 Web服務旨在全天候運行。構建調用Web服務的代碼的最佳方式

構建此代碼的最佳方法是什麼?檢查服務是否「可用」?

我有什麼:

if (NetworkIsAvailable()) 
{ 
    // Call web service 
// Handle exceptions within here. 
} 


else 
{ 
// to throw a relevant exception that there is no network 
} 

是否明智拋出一個異常,或者只是返回false?該svc不應該下降

+0

這取決於NetworkIsAvailable()正在做什麼以查看它是否可用。實際記錄或顯示某些「可用」的原因的例外可能是有用的。沒有什麼是100%的正常運行時間,所以檢查是非常明智的。 – 2012-01-30 17:33:48

+3

我親自在try/catch中運行它。我發現網絡關閉的異常,並返回JSON聲明。 – 2012-01-30 17:35:35

+1

除非您確定無需知道呼叫失敗的原因(不太可能),否則會拋出異常。 (或者,如果你想強制調用者處理可能的失敗,那麼返回某種錯誤代碼對象,但在C#中這不是真正的慣用方法。)'false'和'null'是可怕的錯誤指示符。 – millimoose 2012-01-30 17:56:32

回答

4

根據您收到的數據的類型,檢查的頻率等我會使用一個通用的解決方案,嘗試多次連接失敗,然後分類「例外」上失敗(根據我的經驗,沒有兩個例外是相同的)。

例如:

var failCount = 0; 
var succeeded = false; 

while ((failCount < 3) && (!succceeded)) { 
    try { 
     //call service.... 
     succeeded = true; 
    } catch(WebException wex) { 
     //handle wex, for instance look for timeout and retry 
    } catch(...) { 
    //Handle other exceptions differently... 
    LogError("BOOOM: " + excep); 
    throw; 
    } catch(Exception ex) { 
    //handle a general exception 
    failCount++; 
    } 
} 

if (failCount >= 4) { 
    //Unspecified error multiple times, react appropriately... 
} 

顯然你不希望如果昂貴的調用,在這裏我想它的一種「心跳」檢查那不是太貴爲此多次嘗試。 「failCount」可以根據您希望連接的「動盪」進行調整。

+2

+1不錯的工作方式,以不同的方式處理異常類型,並在優雅地退出之前重試多次。 – Yuck 2012-01-30 18:17:27

+0

謝謝@Yuck,你工作的好公司,看起來很有趣。 :) – GrayWizardx 2012-01-30 18:19:36

+0

好bimplementation。我想我可以捕捉異常並讓用戶重試,並讓其他無法處理的人冒泡。 – dotnetdev 2012-01-30 21:36:03

相關問題