【问题标题】:Remedy subtle difference between generated and expected SOAP message修正生成的和预期的 SOAP 消息之间的细微差别
【发布时间】:2025-12-30 21:30:14
【问题描述】:

我正在尝试在不同平台上托管的服务之间建立一些通信:.net java。我不可能更改 Java 部分中的任何内容。这是我们无权访问的第三方软件。

我的问题基本上归结为服务的期望(使用 SoapUI 测试)和 WCF 发送的内容(通过跟踪测试)之间的细微差别。

预期(或至少允许):

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
     xmlns:ser="http://servicenamespace/">      
    <s:Header /> 
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">      
        <ser:method >           
            <param1/>
            <param2>xxx</param2>
            <param3>zzz</param3>        
        </ser:method>   
    </s:Body>
</s:Envelope>

.NET 实际尝试发送的内容:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Header/>
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <method xmlns="http://servicenamespace/">
            <param1/>
            <param2>xxx</param2>
            <param3>zzz</param3>
        </method>
    </s:Body>
</s:Envelope>

如您所见,差异是微妙的。 servicen 所期望的是标题标签中的命名空间声明...... 有没有办法解决这个问题,最好以低影响(例如不拦截和更改消息)的方式?也许通过以其他方式使用属性?

【问题讨论】:

    标签: java wcf soap interop message


    【解决方案1】:

    不,差异没有您想象的那么微妙,这与命名空间声明的位置无关。这是关于paramX 元素的命名空间。

    • 在您的第一个示例中,paramX 元素位于 null-命名空间中;

    • 在第二个示例中,paramX 元素位于 http://servicenamespace/

    这种差异必须在您的消息正文的 XML Schema 中很明显,并且您用来从 Schema 构建代码的工具必须尊重这一点。因此,也许您可​​以对代码构建工具或生成的代码进行干预。

    【讨论】:

    • 确实需要干预。我求助于手动创建 SOAP 消息并将其发布到服务。一个很好的教训,不要只相信“框架”:)