无法捕获WCF客户端上的Java自定义错误

时间:2012-07-20 11:25:37

标签: java wcf interop faults

问题类似于这个问题:Does WCF FaultException<T> support interop with a Java web service Fault。但是,在我的情况下,确实从服务返回自定义错误。

Tricky解释这个,但在这里:

从新的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),因此它们都获得ErrorCode和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

谢谢, 的Björn

1 个答案:

答案 0 :(得分:0)

有时你需要一点假期。问题解决了:

SvcUtil为通用自定义故障ServiceFault生成了不是一个,而是两个C#类型。另一个位于命名空间层次结构的更深处。并试图抓住其他错误的工作正常。所有更具体的自定义故障(源自XSD中的ServiceFault)都会在此处捕获,我可以看到错误代码和故障描述。这就是我现在所需要的一切。

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

我在上面的代码示例中未能描述的是,SOAP响应中的特定错误MyMethodFault的XML位于返回错误的Detail-tag内:

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

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

感谢您对此或任何进一步评论的任何想法。

/的Björn