2011-09-14 5 views
0

외부 웹 서버 데이터베이스와 통신하기 위해 웹 서비스를 많이 사용하는 .Net Webform 응용 프로그램을 개발 중입니다.웹 서비스 패턴 재 연결

그래서 WS 메서드를 호출 할 때 단절과 실패를 처리하는 가장 좋은 방법을 찾으려고합니다.

지금은 호출 한 모든 WS 메서드에 대해 레이어의 종류와 같은 프록시 함수를 만들었습니다. 특정 WS 호출을 반복하여 성공적으로 호출 할 때까지 루프를 반복합니다.

모두 동기화 및 비동기 호출의 경우 문제를 해결했지만 WebService 레이어에 여분의 유지 관리 및 많은 중복 코드가 포함 된 불필요한 추가 레이어를 추가했습니다.

저는이 표준 상황에 대한 기존 해결책이 없다고 생각하지 않지만 어디에서나 찾을 수는 없습니다.

어떤 아이디어? 다음

, 내 별도의 레이어 (동기화)의 예 :

public static int WsMethod(string param1, int param2) 
{ 
while(true) 
{ 
    try 
    { 
    return new Webpoint().WsMethod(param1, param2); 
    } 
    catch (Exception) 
    { 
    Thread.Sleep(new TimeSpan(0, 0, sleep_seconds)); 
    } 
} 
} 

그리고 비동기은 :

public static void WsMethodAsync(string param1, int param2, WsMethodCompletedEventHandler handler) 
    { 
     while (true) 
     { 
      try 
      { 
       var server = new Webpoint(); 
       server.WsMethodAsyncCompleted += delegate(object sender, WsMethodAsyncCompletedEventArgs args) 
       { 
        if (args.Error != null) 
        { 
         Thread.Sleep(new TimeSpan(0, 0, sleep_seconds)); 
         this.WsMethodAsync(param1, param2, handler); 
        } 
        else 
        { 
         handler(sender, args); 
        } 
       }; 
       server.WsMethodAsyncAsync(param1, param2); 
       return; 
      } 
      catch (Exception) 
      { 
       Thread.Sleep(new TimeSpan(0, 0, sleep_seconds)); 
      } 
     } 
    } 

답변

1

나는이 패턴을 추천하지 않을 것입니다. 통화 매개 변수에 문제가 있으면 영원히 계속 실행됩니다. Normaly 나는 필요한 몇 가지 예외 (CommunicationException, SocketException, 필요한 것)를 잡아서이 상태 (Ok 또는 NoNetwork 등)에 대한 상태 코드를 반환합니다. 또는 예상되는 모든 예외를 MyCommunicationException으로 마무리하고이를 던져 버리십시오 (호출자의 구현 세부 사항을 숨기고 예외 처리를보다 쉽게하기 위해)

그러나 컨트롤을 호출자에게 돌려주고 호출자가 이동 방법을 결정하도록합니다. 에. 다른 예기치 않은 예외를 잡거나 다시 던지지 마십시오.

그러면 발신자는 몇 번이나 반복해서 시도 할지를 결정할 수 있습니다.

1

서비스 나 서비스가 연결되었거나 요청이 실제로 잘못되었을 경우, 무엇이 잘못되었는지를 묻지 않고 무한정 반복됩니다.

서비스 호출 실패의 의미는 무엇입니까? 얼마나 자주 실패합니까? 그리고 무엇보다 이유에 대한 실패는 무엇입니까? 그 이유가 고칠 수있는 것이라면, 고쳐야합니다. 주변에서 일하지 않았습니다.

간단한 예로이 백엔드 서비스 호출이 웹 사이트 사용자에 의해 시작된 경우 (예 : 사용자가 편집 할 데이터를 가져 오는 중) 호출에 실패하면 오류가 발생합니다. 사용자. 다음과 같이 입력하십시오 :

"죄송하지만이 데이터는 현재 제공되지 않습니다.이 문제는 지원팀에 통보되었습니다. 문제가 지속되면 헬프 데스크에 문의하십시오. 800-555-1234에. "

이제는 어떤 일이 발생하더라도 사용자에게 표시하기 위해 일반적인 오류가 발생하지 않아야합니다. 코드는 한 종류의 오류를 다른 오류와 구분할만큼 견고해야합니다. 서비스에 도달 할 수없는 경우이 오류가 적용됩니다.서비스가 요청이 유효하지 않다고 말하는 경우 사용자가 수행중인 작업이나 코드에서 수행중인 작업과 관련하여 문제가 있으며 수정해야합니다. 기타

오류를 처리하고 사용 가능한 응용 프로그램을 유지 관리하는 방법은 궁극적으로 귀하와 비즈니스 전반에 달려 있습니다. 하지만 솔직히 질문에 대해 설명하는 방법을 추천 할 수는 없습니다. 이 접근법은 아무 것도 해결하지 못합니다. 문제가 악화 될 때까지 무시합니다. 오류의 근본 원인을 판별하고이를 무시하지 말아야합니다.

또한 오류가 표시되거나 무시 될 때마다 새끼 고양이가 사망합니다.

+0

David, Carsten, 답장을 보내 주셔서 감사합니다. 이제는 연결 문제와 관련이있는 모든 예외를 식별해야한다고 생각합니다. 즉, 무한 루프가 아닌 n 회 시도하고 다시 시도해 보는 것이 좋습니다. 다른 모든 예외/오류의 경우 호출자에게 제어권을 돌려줍니다. 그러나이 방법에 따라 각 메소드 프록시 함수를 수정하지만 일반 중복 코드로 인해 여전히 어려움을 겪고 있습니다. – Tuk

+0

@Tuk : 이상하게도 그렇게하지 않아도됩니다. 프록시는 현재 수행중인 작업 만 수행해야합니다. 프록시를 호출하는 코드는 예외를 잡아 원하는 방식으로 처리 할 수 ​​있습니다. 몇 번 다시 시도하려는 경우가있는 경우 해당 항목을 식별하고 해당 항목에 대해서만 구현하십시오. 그러나 그것은 목표가되어서는 안됩니다. 재 시도 코드가 오류를보고하여 근본 원인을 식별하고 수정해야합니다. – David