对WCF的服务响应包括重复的命名空间和标记前缀

时间:2014-12-19 18:44:25

标签: c# web-services wcf soap soapui

问题:

  1. 为什么我会收到包含重复标记前缀命名空间的SOAP响应片段?

  2. 为什么我会在SoapUI中使用完全相同的SOAP请求而不是WCF客户端收到不同的响应片段?

  3. 上下文:
    我正在使用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>
    

1 个答案:

答案 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)规范。