2017-10-06 10 views
0

我正在使用令人沮喪的API,它具有改變其限制速率的煩人習慣。有時我可以每秒發送一個請求,有時候我只能每三到四秒發送一個請求。在我無法控制數據源的情況下吞下異常

考慮到這一點,我需要創建一種方法來管理這一點。每當請求失敗時,它將返回503響應(服務不可用)。我目前的計劃是使用我的WebResponseHttpStatusCode來確定我是否應該吞下當前的WebException。我可以重複這個x次,直到請求成功,或者進程完全取消。

請注意,我無法停止並重新啓動進程,因爲這對用戶來說既耗時又損壞數據的結構。

目前,我已經結束了API調用和XML負載到它自己的方法:

int webexceptionnumber = 200; 
public bool webResponseSuccessful(string uri, XmlDocument doc) 
{ 
    try 
    { 
     WebRequest request = HttpWebRequest.Create(uri); 
     WebResponse response = request.GetResponse(); 
     doc.Load(response.GetResponseStream()); 
     return true; 
    } 
    catch(WebException l) 
    { 
     if (((HttpWebResponse)l.Response).StatusCode == HttpStatusCode.ServiceUnavailable) 
     { 
      webexceptionnumber = 503; // I need to do this in a much neater 
      return false;    //fashion, but this is quick and dirty for now 
     } 
     else 
     { 
      return false; 
     } 
    } 
} 

然後我就可以調用該方法,檢查是否就返回一個錯誤值,像這樣:

if (!webResponseSuccessful(signedUri, xDoc)) 
{ 
    //Here is where I'm struggling - see below 
} 

對於如何幹淨地做到這一點,我很難過。我想避免使用goto語句變得更加混亂,那麼當503響應返回時如何重複該操作?是while循環的答案,還是我真的需要刪除額外的整數,並以更清潔的方式做到這一點?

+1

看看這個https://stackoverflow.com/questions/1563191/cleanest-way-to-write-retry-logic。有很多很好的答案,因此請查看並選擇最適合您特定場景的答案。 – Nkosi

+0

這是金色的,我希望我早點知道波莉!謝謝一堆 –

回答

0

將bool更改爲該類型的「返回類型」,其中有一個表示IsSuccessful和ShouldTryAgain的布爾值。然後讓主叫方決定再次運行該操作或繼續。

public class ReturnType { 
public IsSuccessFul{get;set;} 
public ShouldTryAgain {get;set;} 
} 
相關問題