首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当没有定义<detail>时,如何访问SOAP错误中的FaultContract部分?

当没有定义<detail>时,如何访问SOAP错误中的FaultContract部分?
EN

Stack Overflow用户
提问于 2013-12-07 05:10:16
回答 1查看 746关注 0票数 3

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

当故障发生时,我会得到如下响应(为了可读性,名称空间被修剪掉了):

代码语言:javascript
复制
<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>

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

代码语言:javascript
复制
try
{
    proxy.DoWork();
}
catch(FaultException fex)
{
    ...
}

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

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

谢谢

EN

回答 1

Stack Overflow用户

发布于 2014-11-04 17:01:32

您可以使用响应的示例来生成带有命令xsd的模式:

代码语言:javascript
复制
// 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>

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

代码语言:javascript
复制
// 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类的一些属性,但我认为这应该是工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20433627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档