0

我正在使用Enterprise Tester API來導入和更新Web應用程序上的內容。該方案將工作的優良幾個小時,但偶爾它運行到這個未處理的異常:如何處理Web API控制器拋出的異常?

型「System.Net.Http.HttpRequestException」未處理的異常發生在EnterpriseTester.API.Client.dll

附加信息:System.Net.Http.HttpRequestException狀態代碼,表明沒有成功:500(內部服務器錯誤)

在這一點上,在這個地方發生異常行的Visual Studio休息。但是,當我點擊「繼續」時,程序將再次正確執行。

從網上搜索,似乎我應該使用try catch塊來處理異常。我也希望能夠稍微等一下,然後再次執行相同的行以訪問API。

try 
    { 
     client.UpdateScriptRun(Id,Run); 
    } 
    catch (HttpRequestException e) 
    { 
     Console.Writeline("HttpRequestException: {0}", e.Message); 
     Thread.Sleep(1000); 
     client.UpdateScriptRun(Id,Run); 
    } 

我不確定這樣的事情是否可以解決問題,或者如果我需要查看一個完全不同的解決方案。

如果您能指導我找到適合此問題的解決方案,將不勝感激。謝謝!

+0

您上面發佈的代碼是否在WebApiController中運行?如果第一次調用引發異常,爲什麼要讓POST掛起?爲什麼不從你的控制器返回500,然後讓你的客戶再試一次? – maccettura

+0

@maccettura感謝您的問題。上面的代碼來自一個控制檯應用程序。該應用程序正在將我的桌面上的一千個文檔/腳本導入到Enterprise Tester。 「UpdateScriptRun」是我的程序調用POST的API方法之一。如果我返回500,那麼客戶端將不得不從頭再運行這個程序。你會建議作爲替代解決方案嗎? – MShaw

回答

0

通常最好追查異常的根本原因,看看是否有辦法解決它。如果因爲網絡出現間歇性問題而發生連接錯誤是一回事,但500錯誤表明服務器出現問題。如果您有任何方法可以追蹤並修復服務器端錯誤,那是最好的方法。

如果您無法控制服務器,並且只是試圖讓自己的應用程序儘可能地工作,並知道服務器偶爾無故失敗,那麼try/catch解決方案將有所幫助。我會做一些額外的建議,雖然:

  1. 使用更強大的日誌記錄機制,這樣你就可以從日誌文件中告訴事情是如何經常走錯了,也許使用該信息追查問題。將這些參數包含在日誌消息中,以防信息變得有用。
  2. 創建一個幫助器方法來幫助您進行重試,以便您可以在別處重新使用該模式。
  3. 在這種輔助方法中,幾乎立即開始重試,然後等待指數增長的時間段(10ms,100ms,1000ms),直到您看到成功或達到合理的最大限制。
  4. 無論是消耗代碼,都應該有自己的try/catch,以確保用戶在不正常工作時擁有體面的體驗。
+0

謝謝你的回答。由於我無法訪問服務器端,因此您對輔助方法的建議聽起來很有希望。對於這個解決方案,我應該在「catch」塊中使用我的幫助器方法嗎?或者你是否建議在助手方法中使用try-catch。我很抱歉,如果我的問題看起來微不足道,我一點也不熟悉這一點。任何有用的鏈接到相關的主題也將有所幫助。謝謝! – MShaw

+0

將try/catch放在helper方法內部的一個循環中,[有點像這樣](https://stackoverflow.com/a/1563234/120955)。或者你可能覺得值得使用其他人寫的圖書館,比如[Polly](http://www.thepollyproject.org/2016/10/25/polly-5-0-a-wider-resilience-framework/) )。 – StriplingWarrior