无效的SOAP错误;限定名称中使用的未绑定前缀

时间:2015-09-25 08:10:00

标签: c# web-services wcf soap

我一直试图解决这个错误,但我的想法已经用完了。我使用自己的WCF服务调用SOAP Web服务,但是我得到以下CommunicationException:

  

服务器返回了无效的SOAP错误。有关详细信息,请参阅InnerException。

内部(XmlException):

  

限定名称中使用的未绑定前缀' soapenv:Server'。

因此,为了更好地理解它,我使用SOAP UI来查看我得到的响应,如下所示:

<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:pbs="REDACTED" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Body>
      <SOAP-ENV:Fault>
         <faultcode>soapenv:Server</faultcode>
         <faultstring>REDACTED</faultstring>
         <detail>
            REDACTED
         </detail>
      </SOAP-ENV:Fault>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

据我所知,它与故障代码有关,但我不完全确定它是什么。我知道我期望一个FaultException而不是一个Communication Exception。我想对此错误的详细信息中提供一些信息,但此异常隐藏了我的信息。

编辑:

这是他们在主机上收到的请求(从我的网络服务发送):

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
        <setREDACTED xmlns="REDACTED" >
            <infotag>info</infotag>
        </setREDACTED>
    </s:Body>
</s:Envelope>

这是我从SOAPUI发送的那个:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:pbs="REDACTED" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Header/>
    <soapenv:Body>
      <pbs:setREDACTED>
         <infotag>info<infotag>
      </pbs:setREDACTED>
   </soapenv:Body>
</soapenv:Envelope>

1 个答案:

答案 0 :(得分:1)

我发现了问题而且我很抱歉你不得不花时间在这上面,因为它是我的编辑名称空间是问题(主要是@Viru,对不起)

问题是我从我们的合作伙伴处获得的WSDL有一个名为http://derpco.com/OurNamespace的名称空间,但是当我们收到回复时,名称空间被更改为http://derpco.com/Namespace。显然他们会在他们的末端进行名称空间操作,因此我只需要对他们的回复表示不满。 WCF因为无法理解新的命名空间而放弃并返回null,因此不高兴。为了解决这个问题,我创建了一个消息检查器,对xml进行了替换:

public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
        {
            System.IO.File.WriteAllText("c:\\temp\\AfterReceiveReply" + reply.GetHashCode() + ".txt", reply.ToString());

            // Read 
            XmlDocument doc = new XmlDocument();
            MemoryStream ms = new MemoryStream();
            XmlWriter writer = XmlWriter.Create(ms);
            reply.WriteMessage(writer);
            writer.Flush();
            ms.Position = 0;
            doc.Load(ms);

            // Change 
            ChangeMessageToPBSNamespace(doc);

            // Write the new reply 
            ms.SetLength(0);
            writer = XmlWriter.Create(ms);
            doc.WriteTo(writer);
            writer.Flush();
            ms.Position = 0;
            XmlReader reader = XmlReader.Create(ms);
            reply = System.ServiceModel.Channels.Message.CreateMessage(reader, int.MaxValue, reply.Version);
        }

        void ChangeMessageToPBSNamespace(XmlDocument doc)
        {
            string xml = doc.OuterXml;
            xml = xml.Replace("http://derpco.com/Namespace", "http://derpco.com/OurNamespace");
            doc.LoadXml(xml);
        }

使用替换命名空间现在再次匹配WSDL,Deserialiser再次开心