当前位置: 首页 > 知识库问答 >
问题:

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

赏逸春
2023-03-14

上下文:
我用WCF客户机调用第三方的基于Java的web服务。当调用时,从第三方WS发送的SOAP片段响应包含错误标记行上的SOAP信封的重复命名空间和标记前缀,该值不正确,从而导致错误响应。这将导致WCF抛出一个带有XmlException的innerException的CommunicationException,该Exception引用以下内容作为错误:

应从命名空间“”开始元素“faultcode”。从名称空间“http://schemas.xmlsoap.org/soap/envelope/”中找到元素“soap-env:faultcode”。

这个错误消息使我相信SOAP片段中重复的命名空间是罪魁祸首。奇怪的是,在SoapUI中使用从WCF客户机发送到web服务的确切SOAP请求并不会导致此命名空间在SOAP响应片段中重复。

<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个答案

谢泽语
2023-03-14

问题不是重复的命名空间声明。问题就在这一点上:

    <SOAP-ENV:faultcode>SOAP-ENV:Server</SOAP-ENV:faultcode>
    <SOAP-ENV:faultstring>Invalid action parameters</SOAP-ENV:faultstring>

在SOAP规范中,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>

因此,看起来这个服务特别不符合SOAP1.1(或1.2)规范。

 类似资料:
  • 我正在从jaxb模型生成rest响应(使用Jersey)。对于某些响应,生成的XML将名称空间前缀(ns2)添加到名称空间属性中,尽管它们都存在于同一个名称空间中。但对其他人来说,这完全没问题。 根据我的分析,我认为当一个复杂元素(另一个jaxb模型)在其中使用时会发生这种情况。但所有这些模型都在package-info.java中的相同名称空间中声明。 这是代码。 XYZModel.class

  • 问题内容: AngularJS如何处理服务名称之间的冲突?例如,如果我声明了两个模块,每个模块包含一个名为“ foo”的服务。如果我想创建一个可重用的模块或要避免与其他第三方模块发生冲突,哪种是“​​命名空间”服务的好方法? 问题答案: 到目前为止,AngularJS不会处理服务的名称空间冲突, 因此,如果您使用相同的方式将两个不同的模块命名为服务,并且在应用程序中包含了两个模块,则只有一个服务可

  • 我试图使用jaxb解组一个soap响应。 我尝试使用以下代码查找根元素 这是我的样本回复 我能够获取对象,但当我尝试访问中的时,由于前缀 有人能帮我脱身吗? 更新:有人能帮我吗? 我使用stax xml解析器解析为,但我将其中的所有值都视为null。

  • Im使用jaxb生成XML请求。下面是所有的代码细节。我也尝试过包信息的东西,但它不适合我。就像我想在每个对象XML标记上添加命名空间一样。 希望你们明白我的意思。我是做错了什么还是遗漏了什么?或者这种事情在JAXB Java中是可能的。 所需输出 我得到了什么 下面是我的JAXB父Java对象类 下面是我的内部JAXB对象Java类 下面是我的AcctChgRecType JAXB对象类

  • 我一直试图找到一种方法来定义一个命名空间中的服务,该服务链接到另一个命名空间中运行的Pod。我知道在中运行的Pod中的容器可以访问中定义的,方法是在集群DNS中将其引用为,但我不希望容器中的代码需要知道的位置。也就是说,我希望代码只查找,然后能够访问它。 Kubernetes文档表明这是可能的。它指出,定义不使用选择器的服务的原因之一是,您希望将服务指向另一个命名空间或另一个集群上的服务。 这告诉

  • 据我所知,命名空间std包含所有的C++标准库,其中一个标准库是iostream,它有对象cout和cin。 上面的结构正确吗?还是不同?