2009-05-13 4 views
1

현재 클라이언트 프로그램에서 C# .NET 서비스를 사용하고 있습니다. 서버 설계의 일환으로 특정 오류를 나타 내기 위해 몇 가지 사용자 정의 예외가 발생합니다 (일반적인 데스크탑 프로그램 에서처럼).웹 서비스를 통한 특정 예외의 적절한 catch

웹 서비스가 이러한 오류를 포착하고 메시지 필드에 실제 예외 (예 : NoRoomsAvailableException)가 기록 된 FaultException으로 직렬화하는 것이 문제입니다.

제 질문은 이러한 오류를 처리하는 가장 좋은 방법이 있는지 여부입니다. 우리는 방금이 작업을 시작했으며, 예외 유형 및 오류 메시지를 추출하기 위해 텍스트 패턴 일치를 수행 할 것입니다. 그러나이를 수행하는 해커처럼 보입니다. 그렇게하는 "깔끔한"방법은 많이 될 것입니다. 고맙습니다.

답변

2

올바른 방법은 오류 계약을 정의하는 것입니다. 당신이

[ServiceContract] 
public interface IMyServiceContract 
{ 
    [OperationContract] 
    [FaultContract(typeof(NoRoomsAvailableFaultContract))] 
    void MyOperation(); 
} 

주어진 서비스 작업이 계약을 선언 그리고 당신과 같이 그것을 구현

[DataContract] 
public class NoRoomsAvailableFaultContract 
{ 
    [DataMember] 
    public string Message { get; set; } 
} 

다음 :

public class MyService : IMyServiceContract 
{ 
    public void MyOperation() 
    { 
     if (somethingWentWrong) 
     { 
      var faultContract = new NoRoomsAvailableFaultContract() 
      { 
       Message = "ERROR MESSAGE" 
      }; 
      throw new FaultException<NoRoomsAvailableFaultContract>(faultContract); 
     } 
    } 
} 

웹 서비스 예를 들어, 당신은 다음을 수행 할 수 이 경우 NoRoomsAvailableFaultContract가 WSDL에 노출되고 svcutil.exe는 프록시 클래스를 생성 할 수 있습니다. 그렇다면이 예외를 잡을 수 있습니다 :

try 
{ 
    myServiceProxy.MyOperation(); 
} 
catch (FaultException<NoRoomsAvailableFaultContract> ex) 
{ 
    Console.WriteLine(ex.Message); 
} 
+0

나는 이것이 내 catch 문에서 FaultException 의 FaultException 을 분리 할 수 ​​있다고 가정합니다. –

+0

예, 다른 오류 예외를 잡을 수 있습니다. –

0

다린은 정답입니다. 웹 서비스가 예외를 넘기지 않는다는 것을 명시 적으로 말할 것입니다. SOAP 오류를 반환합니다. 오류를 올바르게 정의하면 FaultException < 오류>을 던질 수 있습니다. 세부 요소에 오류이있는 SOAP 결함이됩니다. .NET 클라이언트의 경우,이 오류는 FaultException < 오류>으로 바뀌며이를 catch 할 수 있습니다.

다른 플랫폼에서 다소 다르게 처리 할 수 ​​있습니다. 필자는 IBM의 Rational Web Developer가 선언 된 각 오류에 대해 별도의 예외를 만드는 Java 프록시 코드를 생성하는 것을 보았습니다. 이는 Java generics 이전 버전 이었으므로 .NET과 동일한 기능을 수행합니다.

관련 문제