3

我正在使用 WCF 连接到业务合作伙伴的 Web 服务。Web 服务没有定义的故障契约 - <wsdl:fault>WSDL 中没有元素。

当发生故障时,我会得到这样的响应(为了可读性而修剪命名空间):

<s:Envelope>
   <s:Body>
      <Fault>
         <faultcode>xxx</faultcode>
         <faultstring>Business data error</faultstring>
         <detail>
            <Error>
               <ErrorCode>xxx</ErrorCode>
               <ErrorDescription>xxx</ErrorDescription>
            </Error>
         </detail>
      </Fault>
   </s:Body>
</s:Envelope>

在我的代码中,我可以像这样捕获异常:

try
{
    proxy.DoWork();
}
catch(FaultException fex)
{
    ...
}

但是因为没有定义的 FaultContract 我不能使用基于泛型的FaultException(比如catch(FaultException<myFaultType>))。

长话短说,我需要能够检查上述 SOAP 错误中返回的元素中的<ErrorCode><ErrorDescription>元素。<Error>catch

谢谢

4

1 回答 1

0

您可以使用响应示例通过命令 xsd 生成模式:

// xsd foo.xml
<s:Envelope xmlns:s="foo.com">
 <s:Body>
  <Fault>
     <faultcode>xxx</faultcode>
     <faultstring>Business data error</faultstring>
     <detail>
        <Error>
           <ErrorCode>xxx</ErrorCode>
           <ErrorDescription>xxx</ErrorDescription>
        </Error>
     </detail>
  </Fault>
</s:Body>

然后,您可以使用相同的命令生成 serealization 类:

// xsd foo.xsd /c
...
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="foo.com")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="foo.com", IsNullable=false)]
public partial class Envelope {
...

也许您必须编辑类 foo.c 的某些属性,但我认为这应该可行。

于 2014-11-04T09:01:31.657 回答