我一直试图解决这个错误,但我的想法已经用完了。我使用自己的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>
答案 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再次开心