2010-01-26 2 views
5

내 WCF 서비스에서 FaultException 내부에 내 자신의 예외를 던지고 내 WCF 클라이언트에서 catch하려고합니다. 그러나 클라이언트 측에서는 예외가 비정상적인 FaultException으로 잡히고 내 사용자 정의 예외의 세부 정보가 손실됩니다.오류 예외의 세부 정보로 사용자 지정 예외가 발생했습니다.

내 사용자 정의 예외입니다 :

여기
[Serializable] public class MyCustomException : ApplicationException 
{ ... } 

내가 그것을 던져 방법은 다음과 같습니다

throw new FaultException<MyCustomException>(new MyCustomException("foo bar!")); 

(내가 가지고 할 수 있습니다 A [FaultContract (대해서 typeof (MyCustomException))] 내 방법 위에 배치 인터페이스)

그리고 여기 내 고객에게 잡으려고합니다 :

... 
catch (FaultException<MyCustomException> mcex) 
{ 
    Console.WriteLine(mcex); 
} 
catch (FaultException fex) 
{ 
    Console.WriteLine(fex); 
} 

제 목표는 예외를 위의 첫 번째 catch 절에서 잡아내는 것입니다.하지만 두 번째 catch 절에서 잡히게됩니다.

궁금한 점은 MyCustomException을 ApplicationException으로 대체하면 FaultException이 제대로 포착된다는 것입니다.

문제는 MyCustomException이 Serializable이며 DataContractSerializer를 통해 직렬화되어 있지 않으며 WCF에 대한 추가 지시문이 누락되었다고 생각합니다. ServiceKnownType 속성의 줄에 뭔가가 있습니까? (비록 그것을 시도했지만 아무 소용이 없음).

[ServiceContract] 
interface IYourService 
{ 
    [OperationContract] 
    [FaultContract(typeof(MyCustomException))] 
    SomeReturnValue YourMethodCall(SomeInputValue input); 
} 

이렇게 만하면, 은 다음 잡을 수 : 당신이 당신의 서비스 계약에 오류 계약 등의 유형을 지정할 때까지

답변

3

예, 일반 오류 예외를 잡을 수 없습니다 클라이언트 측 코드에서 일반적으로 형식화 된 특정 FaultException을 처리합니다.

더 많은 배경과 WCF 오류 처리에 대한 자세한 정보는 MSDN docs on FaultException<T>blog post을 참조하십시오.

또한, 나는 개인적으로 항상 [DataContract] 속성으로 내 잘못 계약 클래스를 장식하는 것 (모든 회원은 내가 [DataMember를]에 연재 한 할) :

[Serializable] 
[DataContract] 
public class MyCustomException : ApplicationException 
{ ... } 
+1

감사 도와하지만 난 '으로 원래 언급했듯이 ServiceContract의 throwing 메서드에 FaultContract 특성이 올바르게 설정되어 있는데 문제가 해결되지 않았습니다. 또한 AFAIK는 항상 [DataContract]를 사용하여 .net에서 예외를 장식 할 수 없습니다. 예외는 항상 ISerializable을 구현하며이 두 직렬화 메커니즘이 충돌합니다. 적어도 오늘이 시도했을 때, 나는 그것을 나타내는 아주 명백한 오류로 끝났다. http://tinyurl.com/yd634sa 및 여기 : http://tinyurl.com/y8jgf42 :) – urig

+0

예, 일반적으로 SOAP 결함은 .NET 클라이언트가 아닌 클라이언트와의 상호 운용성을 위해 설계되었으므로 귀하의 세부 정보로 표준 .NET 예외를 사용하지만 [DataContract] 및 [DataMember]로 장식 할 사용자 정의 클래스 –

관련 문제