首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >soap错误消息中的多个名称空间导致FaultException反序列化失败

soap错误消息中的多个名称空间导致FaultException反序列化失败
EN

Stack Overflow用户
提问于 2009-09-17 22:27:20
回答 3查看 2.1K关注 0票数 2

我们正在连接到一个web服务,而我们得到的错误消息根本没有反序列化,而且我能做的任何版本的类都不能正确反序列化。我们无法控制服务器端的事情。服务器不允许发现,因此将?WSDL添加到终结点的URL末尾会导致错误,而不是WSDL。

Fiddler显示返回的故障消息如下所示:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:eGov="http://eGov.gov" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Body>
    <soapenv:Fault>
    <faultcode>Client</faultcode>
    <faultstring/>
      <detail>
        <eGov:eGov2Exception>
          <eGov:ErrorClassification>SOME_ERROR</eGov:ErrorClassification>
          <eGov:ErrorCode>SOME_ERROR_CODE</eGov:ErrorCode>
          <eGov:ErrorMessage>Your request was unsuccessful. blah blah blah.</eGov:ErrorMessage>
        </eGov:eGov2Exception>
      </detail>
    </soapenv:Fault>
  </soapenv:Body>
</soapenv:Envelope>

然而,当我们试图捕获它时,没有一个类(尝试xsd.exe、svcutil和其他类,包括我们从头开始编写的代码)可以反序列化它:

代码语言:javascript
复制
catch (FaultException<eGov2ExceptionType> exp)
  {
     // Never stops here. 
  }
catch (FaultException<AllOtherAttemptedClasses> exp)
  {
     // Never stops here. 
  }
catch (SoapException se)
  {
     // Never stops here. 
  }
catch (FaultException exp)
  {
     //Always gets caught here. 
  }

只有基本的FaultException捕获将被调用,这意味着我们丢失了正在发送的FaultMessage的内容。我编写的一些类将非常接近上面的示例进行序列化,但无法对其进行反序列化,因此我们怀疑存在名称空间问题。

问题:

1-你会如何写这篇文章?

2-这是WCF的常见错误/问题吗?

1:http://www.fiddler2.com/fiddler2/小提琴手

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-09-25 18:03:07

我们最终所做的是放弃尝试捕获错误,并将其传递回SOAP通道。相反,我们创建了一个自定义异常,并连接了一个MessageInspector来监视故障并将其作为异常抛出。

(经过清理的)代码的相关部分:

代码语言:javascript
复制
   public void AfterReceiveReply(ref Message reply, object correlationState)
    {
        if (reply.IsFault)
        {
            XmlDictionaryReader xdr = reply.GetReaderAtBodyContents();
            XNode xn = XDocument.ReadFrom(xdr);
            string s = xn.ToString();
            XDocument xd = XDocument.Parse(s);
            XNamespace nsSoap = "http://schemas.xmlsoap.org/soap/envelope/";
            XNamespace ns = "http://eGov.gov";
            XElement xErrorClass = xd.Element(nsSoap + "Fault").Element("detail").Element(ns + "eGov2Exception").Element(ns + "RequestErrorClassification");
            XElement xErrorCode = xd.Element(nsSoap + "Fault").Element("detail").Element(ns + "eGov2Exception").Element(ns + "RequestErrorCode");
            XElement xErrorMessage = xd.Element(nsSoap + "Fault").Element("detail").Element(ns + "eGov2Exception").Element(ns + "RequestErrorMessage");

            throw new eGovException(xErrorClass.Value, xErrorCode.Value, xErrorMessage.Value);
        }
    }

然后,主应用程序使用:

catch (eGovException ex)

{

代码语言:javascript
复制
 // Handles exception here.

}

尝试更正名称空间浪费了太多的时间。谢谢你的回复。

票数 4
EN

Stack Overflow用户

发布于 2009-09-18 08:02:11

如果序列化完全失败,处理此问题的一种方法是使用使用Message类型的OoperationContract作为输入和输出。这样,您就可以在Iffault ==为true时手动解析XML,或者在没有发生错误时使用GetBody()来获取常规内容。

票数 1
EN

Stack Overflow用户

发布于 2009-09-19 20:19:10

首先,如果您不能从制作此web服务的人员那里获得WSDL,那么他们就没有资格拥有基于SOAP的web服务。无论是否使用"? WSDL“,正确的WSDL都可以解决您的问题。

其次,请发布eGov2ExceptionType类的代码。我怀疑它没有设置http://eGov.gov名称空间。

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

https://stackoverflow.com/questions/1441647

复制
相关文章

相似问题

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