问题类似于这个问题: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
谢谢, 比约恩