2008-12-11 2 views
5

웹 서비스 메서드/호출을 try/catch 블록으로 래핑하는 것이 가장 좋습니다.try/catch 블록에서 웹 서비스 래핑

웹 서비스 요청이 .NET 데스크탑 응용 프로그램이 충돌하는 이유가되는 경향이 있습니까? 그래서 나는 이것을 막기 위해 모든 호출을 try/catch에 넣어야한다고 생각하고있었습니다.

좋은 아이디어?

또한 예외가 발생하거나 빈 캐치가 있어야합니까?

답변

4

질문에 태그가 지정되어 있으므로 WCF를 사용한다고 가정합니다. WFC를 사용한 예외 처리의 우수 사례는 소비자에게 전선을 통해 예외가 발생하는 것을 허용하지 않지만 대신 의미있는 FaultExceptions를 던집니다.

예외가 발생할 수있는 경우 항상 작업 ... try 블록을 사용해야합니다. 원시 예외 조항을 버블 링하도록 허용하는 경우 다음 두 가지 시나리오가 발생할 수 있습니다. 예외적 인 세부 정보를 허용하도록 서비스를 구성한 경우 보안 위반으로 인해 서비스 내부가 노출 될 수 있습니다. 또는 서비스에이 기능을 구성하지 않았고 소비자가 뭔가 잘못되었음을 알리는 매우 일반적인 메시지를받습니다.이 메시지는 사용자 나 지원팀에게별로 도움이되지 않습니다.

사용자가 수행해야하는 메시지에 따라 하나 이상의 FaultExceptions을 선언해야합니다. 작업 선언에서 오류를 FaultContracts로 꾸미십시오. 그런 다음 특정 예외를 포착하고 특정 오류를 던집니다. try ... catch를 사용하여 예외를 포착하고 매우 일반적인 오류를 발생시킬 수도 있습니다.

여기의 핵심은 내부적으로 작업에 어떤 일이 일어나고 있는지에 대해 너무 많은 정보를 드러내지 않습니다. 특히 트레이스를 스택하십시오!

오류는 다른 데이터 계약이므로 WSDL에 선언되어 있습니다. 즉, 소비자가 오류를 구체적으로 포착 할 수 있고 코드에서 던져진 예외 인 것처럼 작업에서 발생하는 오류에 대응할 수 있습니다.

희망이 도움이됩니다.

조.

0

예외가 발생할 수 있으므로 try catch 블록에 래핑해야합니다. 시도의 catch 블록에 웹 서비스 방법을 넣기는 프로그램 로직에 따라 예외 핸들러와 함께해야 할 일

은 ...

0

당신이 전화를 충돌하고 싶지 않아 언급 한 바와 같이, 좋은 생각 웹 서비스 메소드에서 문제가 발생했기 때문에

또한 클라이언트에 예외를 throw하는 대신 어쨌든 그것에 대해 아무 것도 할 수없는 사용자는 모든 웹 서비스 메서드가 호출 상태를 포함 할 수있는 구조 또는 작은 클래스를 반환하도록 고려할 수 있습니다 , 오류 코드 및 오류를 설명 할 수있는 친숙한 메시지가 포함됩니다.

1

예, 웹 서비스 호출을 try-catch로 랩핑해야합니다. 빈 캐치는 (대부분) 순수한 악마이기 때문에 사용하지 마십시오. catch 블록은 적어도 예외를 기록해야합니다. 귀하의 응용 프로그램 논리에 대해 모르겠지만 아마도 일부 메시지 (예 : "기술 오류로 인해 서비스에서 가져온 정보가 가져 오지 않았습니다")가 사용자에게 표시되어야합니다.

2

괜찮습니다. 처리 할 수있는 예외 유형을 잡으려고합니다.

"예외"를 포착하거나 그렇게 할 경우 사용자에게 로그 및/또는 경고를 보내지 말고 웹 서비스에 다시 전화하십시오.

Windows Forms 앱의 경우 디버깅 또는 테스트 중에 예외를 숨기지 않기 위해 일반적으로 #if 디버그 블록에서 마지막 "예외"catch를 래핑합니다.

#if !DEBUG 
catch (Exception ex) 
{ 
    // show messagebox, log, etc 
} 
#endif 
1
using System; 
using System.ServiceModel; 
using Entities; //my entities 
using AuthenticationService; //my webservice reference 

namespace Application.SL.Model 
{ 
    public class AuthenticationServiceHelper 
    { 
     /// <summary> 
     /// User log in 
     /// </summary> 
     /// <param name="callback"></param> 
     public void UserLogIn(Action<C48PR01IzhodOut, Exception> callback) 
     { 
      var proxy = new AuthenticationServiceClient(); 

     try 
     { 
      proxy.UserLogInCompleted += (sender, eventargs) => 
      { 
       var userCallback = eventargs.UserState as Action<C48PR01IzhodOut, Exception>; 
       if (userCallback == null) 
        return; 

       if (eventargs.Error != null) 
       { 
        userCallback(null, eventargs.Error); 
        return; 
       } 
       userCallback(eventargs.Result, null); 
      }; 
      proxy.UserLogInAsync(callback); 
     } 
     catch (Exception ex) 
     { 
      proxy.Abort(); 
      ErrorHelper.WriteErrorLog(ex.ToString()); 
     } 
     finally 
     { 
      if (proxy.State != CommunicationState.Closed) 
      { 
       proxy.CloseAsync(); 
      } 
     } 
     } 
} 

개선점이 있습니까?