2

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

很难解释这一点,但在这里:

从一个新的 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

谢谢, 比约恩

4

1 回答 1

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 中的“基本”ServiceFault。在上面的 SOAP 中,您可以清楚地看到具体故障的类型或名称。不过,当异常被捕获时,我不知道如何获取该类型/名称。我看到的只是错误代码和错误描述。但是,只要我能捕捉到 ServiceFault 并查看代码和描述,一切都很好。

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

/比约恩

于 2012-08-02T13:56:27.847 回答