2012-07-20 2 views
1

문제는 다음 질문과 비슷합니다. Does WCF FaultException<T> support interop with a Java web service Fault. 그러나, 내 경우에는 사용자 지정 오류가 실제로 서비스에서 반환됩니다. WCF 클라이언트에서 Java 사용자 지정 오류를 catch 할 수 없습니다.

까다로운

이를 설명하는 그러나 여기 간다 : 새 WCF 클라이언트에서

, 나는 기존의 자바 웹 서비스 (즉, 클라이언트의 다른 종류 년 동안 잘 작동하고있다)를 호출하고 있습니다. 서비스 XSD 한 사용자 지정 오류 ServiceFault를 정의

이 ServiceFault 모든보다 구체적인 사용자 지정 오류에 사용 (예 : MyMethodFault.) 그래서 그들은 모두 그렇게처럼 ErrorCode가와 ERRORDESCRIPTION 특성을 얻을 수있다
<xs:complexType name="ServiceFault"> 
     <xs:annotation> 
      <xs:documentation>On service error</xs:documentation> 
     </xs:annotation> 
     <xs:all> 
      <xs:element name="ErrorCode" type="xs:string"/> 
      <xs:element name="ErrorDescription" type="xs:string"/> 
     </xs:all> 
    </xs:complexType> 

:

<xs:element name="MyMethodFault" type="ServiceFault"> 
    <xs:annotation> 
     <xs:documentation>On error in MyMethod</xs:documentation> 
    </xs:annotation> 
</xs:element> 
이 같은

<wsdl:message name="MyMethodFault"> 
<wsdl:part element="tns:MyMethodFault " name="MyMethodFault"> 
</wsdl:part> 

을 그리고 마지막으로, 작업은 그 결함으로 정의됩니다 :

다음, 장애에 대한 WSDL-메시지는 다음과 같이 정의된다

<wsdl:fault message="tns:MyMethodFault" name="MyMethodFault"> 

지금까지 나에게 잘 어울립니다. 그리고 실행시, 서비스는 깔끔하게과 같이 상세 SOAP-태그에 오류를 반환

<ns2:MyMethodFault xmlns:ns2="urn:salessystem:entity:MyService:v1.0"> 
<ns2:ErrorCode>1000</ns2:ErrorCode> 
<ns2:ErrorDescription>TheErrorDescr</ns2:ErrorDescription> 
</ns2:MyMethodFault> 

그러나,는 svcutil은 더 특정 사용자 지정 오류 만 ServiceFault를 생성하지 않았다. 이것은 서비스 참조에 MyMethodFault의 유일한 대한 언급이다 MyMethodFault 내가 FaultException<MyMethodFault>.를 잡을 그리고 또한 할 수없는 존재하지 않기 때문에

, WCF 매핑되지 않습니다

[OperationContractAttribute(Action = "", ReplyAction = "*")] 
[FaultContractAttribute(typeof(sale...ServiceFault), Action="", Name="MyMethodFault")]   
[ServiceKnownTypeAttribute(typeof(ServiceFault))] 
MyMethodResponse MyMethod(MyMethodRequest1 request); 

그래서, 여기에 문제가 런타임에 ServiceFault에 MyMethodFault와 같은 특정 오류가 발생하여 FaultException<ServiceFault> 예외가 catch되지 않습니다. 따라서 나는 결코 오류 설명을 얻지 못한다.

내가 잘못했거나 WSDL 또는 SvcUtil 사용을 조정해야합니까?

희망의 사람은 모든 질문을 이해할 수있다 : P

는 감사, 비욘

답변

0

때때로 약간의 휴가는 당신이 필요로하는 모두이다. 문제 해결 :

SvcUtil은 일반 사용자 정의 오류 ServiceFault에 대해 하나가 아니라 두 개의 C# 유형을 생성했습니다. 다른 하나는 네임 스페이스 계층 구조에서보다 깊숙히 위치했습니다. 그 다른 잘못을 잡으려고 노력하는 것은 괜찮습니다. XSD의 ServiceFault에서 파생 된보다 구체적인 모든 사용자 지정 오류가 여기에 포착되고 오류 코드와 오류 설명을 볼 수 있습니다. 그게 바로 지금 필요한 전부입니다.

그러나 XSD에 설명 된 MyMethodFault와 같은보다 구체적인 사용자 지정 오류에 대해 생성 된 C# 형식이 아직 없습니다. 하지만 어쩌면 그럴 수는 없어!

<SOAP-ENV:Fault> 
    <faultcode>SOAP-ENV:Server</faultcode> 
    <faultstring xml:lang="en">ServiceException</faultstring> 
    <detail> 
    <ns2:MyMethodFault xmlns:ns2="urn:salessystem:entity:MyService:v1.0"> 
     <ns2:ErrorCode>1000</ns2:ErrorCode> 
     <ns2:ErrorDescription>My+Error+Description</ns2:ErrorDescription> 
    </ns2:UcsAgreemenFault> 
    </detail> 
</SOAP-ENV:Fault> 

이 오류가 매핑됩니다 : 나는 위의 코드 예제에서 설명하지 못한 무엇

는 SOAP 응답의 특정 오류 MyMethodFault의 XML 반환 된 오류의 상세 태그 내부에 있다는 것이다 "기본"ServiceFault 내 try/catch에서. 위의 SOAP에서 특정 결함의 유형이나 이름을 명확하게 볼 수 있습니다. 예외가 잡힐 때 그 유형/이름을 잡는 방법을 모르겠다. 내가보기에는 ErrorCode와 ErrorDescription 만 있습니다. 그러나 ServiceFault를 잡아 코드와 설명을 볼 수있는 한 모든 것이 잘되어 있습니다.

의견이나 다른 의견을 보내 주셔서 감사합니다.

가정 비슷한 문제를 경험하는 사람으로/비욘

+0

, 당신이 날 마지막 코멘트를 이해하는 데 도움이 바랍니다 수>는 svcutil은 하나가 아닌 일반 사용자 두 가지의 C# 유형> 오류 ServiceFault를 생성합니다. 다른 하나는 계층 구조 네임 스페이스 >에 더 깊숙이 위치했습니다. 그 다른 잘못을 잡으려고 노력하는 것은 괜찮습니다. 그 "다른"잘못을 어떻게 알아 냈습니까? 어쩌면 코드 예제일까요? – saygley

관련 문제