2012-07-20 134 views
1

问题与此问题类似:Does WCF FaultException<T> support interop with a Java web service Fault。但是,就我而言,自定义错误确实是从服务返回的。无法捕获WCF客户端上的Java自定义错误

整蛊解释这一点,但这里有云:

从一个新的WCF客户端,我打电话现有的Java Web服务(即一直运作良好多年来与其他类型的客户端)。服务XSD定义了一个自定义错误ServiceFault:

<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> 

这ServiceFault用于所有更具体的自定义错误(例如MyMethodFault。)所以,他们都得到了错误代码和ErrorDescription中的属性,就像这样:

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

接下来,对于故障的WSDL的消息定义,就像这样:

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

最后,操作与故障定义是这样的:

<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在服务引用中唯一提的是:

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

所以,现在的问题是:

由于MyMethodFault不存在,我不能赶上FaultException<MyMethodFault>.,此外,WCF不会映射在运行时将MyMethodFault等特定故障传递给ServiceFault,因此从不会捕获类型为FaultException<ServiceFault>的异常。因此,我从来没有得到错误描述。

我做错了什么,或者我需要调整WSDL或SvcUtil使用?

希望任何人都可以明白的问题都:P

感谢, 比约恩

回答

0

有时一个小长假是你所需要的。已解决的问题:

SvcUtil为通用自定义故障ServiceFault生成了不是一个,而是两个C#类型。另一个位于命名空间层次结构的更深处。并试图捕捉到其他故障的情况很好。所有更具体的自定义错误(从XSD中的ServiceFault派生而来)都会在这里被捕获,我可以看到错误代码和错误描述。这就是我现在需要的。

但是,我仍然没有为更具体的自定义错误(例如XSD中描述的MyMethodFault)生成C#类型。但也许我不应该!

我没在上面的代码范例来说明的是,具体故障MyMethodFault在SOAP响应XML是在返回的故障的详细信息标签内:

<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> 

此故障被映射到“基地”ServiceFault在我的try/catch中。在上面的SOAP中,您可以清楚地看到特定故障的类型或名称。不过,当发现异常时,我不知道如何获得该类型/名称。我看到的只是ErrorCode和ErrorDescription。但是,只要我能够捕获ServiceFault并查看代码和说明,一切都很好。

感谢您对此意见或任何其他意见的任何想法。

/比约恩

+0

正如有人谁理应经历了类似的问题,请你帮助我理解你的最后的评论:> SvcUtil工具生成的不是一个,而是两个C#类型为通用定制 >故障ServiceFault。另一个位于命名空间 >层次结构的更深处。并试图捕捉到其他故障的情况很好。你是如何捕捉到“其他”错误的?也许一些代码示例? – saygley 2014-02-25 14:55:57