2017-10-06 3 views
0

나는 조절 속도를 변화시키는 성가신 버릇이있는 실망한 API로 작업하고 있습니다. 때로는 초당 하나의 요청을 보낼 수 있으며 때로는 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; 
     } 
    } 
} 

내가 그때 그렇게처럼, 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

이것은 황금으로, 나는 Polly에 대해 더 빨리 알았 으면 좋겠다. 무리 감사 –

답변

0

bool을 IsSuccessful 및 ShouldTryAgain이라고하는 부울이있는 유형의 "return type"으로 변경하십시오. 그런 다음 호출자가 작업을 다시 실행하거나 계속 진행하도록하십시오.

public class ReturnType { 
public IsSuccessFul{get;set;} 
public ShouldTryAgain {get;set;} 
} 
관련 문제