2017-10-06 3 views
0

私は調整速度を変える厄介な習慣を持つ欲求不満なAPIを使っています。時には1秒間に1回のリクエストを送信できます.3〜4秒ごとにリクエストを送信できる場合もあります。私はデータのソースを制御できない例外を呑み込む

これを念頭に置いて、これを管理する方法を作成する必要があります。要求が失敗するたびに、503応答(サービスを利用できません)が返されます。私の現在の計画は、WebResponseHttpStatusCodeを使って、私が現在のものを飲み込むべきかどうかを判断することです。WebException。要求が成功するか、プロセスが完全に取り消されるまで、x回繰り返すことができます。

ユーザーが時間がかかり、データの構造を損なうため、プロセスを停止して再開できないことに注意してください。

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; 
     } 
    } 
} 

私はそのようにように、それは偽の値を返すかどうかをチェックする、これを呼び出すことができます:

現在、私はそれ自身のメソッドにAPIの呼び出しとXMLの負荷を包まれている

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というブール値を持つ型の "return type"に変更します。次に、呼び出し元に操作を再実行するか、続行させるかを選択させます。

public class ReturnType { 
public IsSuccessFul{get;set;} 
public ShouldTryAgain {get;set;} 
} 
関連する問題