问题:
为什么我会收到包含重复标记前缀命名空间的SOAP响应片段?
为什么我会在SoapUI中使用完全相同的SOAP请求而不是WCF客户端收到不同的响应片段?
上下文:
我正在使用WCF客户端调用基于Java的第三方Web服务。从第三方WS发送的SOAP片段响应在使用导致错误响应的错误值调用时,在Fault标记行上包含soap信封的重复命名空间和标记前缀。这会导致WCF抛出一个带有XmlException的innerException的CommunicationException,它引用以下错误:
从命名空间''期望启动元素'faultcode'。找到元素'SOAP-ENV:faultcode' 来自命名空间“http://schemas.xmlsoap.org/soap/envelope/”。
此错误消息让我相信SOAP片段中的重复命名空间是罪魁祸首。奇怪的是,使用从WCF客户端发送到SoapUI中的Web服务的确切SOAP请求不会导致此命名空间在SOAP响应片段中重复。
WCF客户端正在使用basicHttpBinding。
请参阅下面的请求的SOAP片段,通过WCF的响应以及通过SoapUI的响应。
WCF和SoapUI发送的请求:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Search xmlns="urn:ent.soap.testservice.com/objs">
<Request objType="Report">
<RequestorId>ABCD</RequestorId>
<TargetId></TargetId>
</Request>
</Search>
</s:Body>
</s:Envelope>
WCF客户收到的响应:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<SOAP-ENV:Fault xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:faultcode>SOAP-ENV:Server</SOAP-ENV:faultcode>
<SOAP-ENV:faultstring>Invalid action parameters</SOAP-ENV:faultstring>
<SOAP-ENV:detail>
<fns:fault xmlns:fns="urn:fault.soap.testservice.com" xmlns:java="java" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="fns:ApiFault">
<fns:exceptionCode>INTERNAL_ERROR</fns:exceptionCode>
<fns:exceptionMessage>Invalid action parameters</fns:exceptionMessage>
<fns:logDataExchangeId>1234567890</fns:logDataExchangeId>
</fns:fault>
</SOAP-ENV:detail>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
SoapUI收到的回复:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<SOAP-ENV:faultcode>SOAP-ENV:Server</SOAP-ENV:faultcode>
<SOAP-ENV:faultstring>Invalid action parameters</SOAP-ENV:faultstring>
<SOAP-ENV:detail>
<fns:fault xsi:type="fns:ApiFault" xmlns:fns="urn:fault.soap.testservice.com" xmlns:java="java" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<fns:exceptionCode>INTERNAL_ERROR</fns:exceptionCode>
<fns:exceptionMessage>Invalid action parameters</fns:exceptionMessage>
<fns:logDataExchangeId>1234567890</fns:logDataExchangeId>
</fns:fault>
</SOAP-ENV:detail>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
答案 0 :(得分:1)
问题不在于重复的名称空间声明。问题在于:
<SOAP-ENV:faultcode>SOAP-ENV:Server</SOAP-ENV:faultcode>
<SOAP-ENV:faultstring>Invalid action parameters</SOAP-ENV:faultstring>
在SOAP Specification上,faultcode和faultstring元素位于空的默认命名空间中,而不在“http://schemas.xmlsoap.org/soap/envelope/”命名空间中。所以它真的应该看起来像这样:
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:MustUnderstand</faultcode>
<faultstring>SOAP Must Understand Error</faultstring>
</SOAP-ENV:Fault>
所以看起来这个服务特别不符合SOAP 1.1(或者说就此重要的1.2)规范。