使用连接到 WCF 服务的 Java 客户端在 XML 正文中嵌入 XML 指令

Posted

技术标签:

【中文标题】使用连接到 WCF 服务的 Java 客户端在 XML 正文中嵌入 XML 指令【英文标题】:Embedding XML directive in XML body using Java Client connecting to WCF service 【发布时间】:2021-08-31 16:30:33 【问题描述】:

我们的 Java 代理需要与基于 WCF 的 ESB/服务进行通信。

看起来服务期望 XML 有效负载如下所示:

<xmlRequest><?xml version="1.0" encoding="UTF-8" standalone="yes"?><payload/></xmlRequest>

有没有办法绕过 SAAJ,以便 WCF 服务得到它需要的东西?

详情

我知道这是非法的,但他们的服务正在生产中,我正在尝试更换我们的 DataPower 设备。 我们当前的安全代理,迭代 #3,是基于 DOM 的。

正如我所料,当我使用 XSLT 添加 XML 指令时,SAAJ 指示错误。

我已尝试使用以下方法转义 XML 指令:

     CDATA to escape the XML directive.

     CDATA to escape the entire payload.

     Massaging the directive to look like valid XML 
     Using html escape characters.

使用了 Ws-Security:spring-ws + WSS4J,因此一旦得到保护,我们就无法在出站 http 级别修改有效负载。

我们为合理的用例修改了 spring-ws,但我不相信为这种特殊情况修改 wss4j 是可维护的。

选项

看起来最易于维护的选项是使用 WSS4J 切换到简单的基于 CXF 流的方法。

尽职调查 这听起来可能很熟悉,但在我继续使用 CXF 之前,管理层希望确保没有巧妙的技巧来逃避该 XML 指令。

欢迎任何 cmets,包括好脾气的责骂!

【问题讨论】:

事实证明,即使我要求从我用来捕获数据的应用程序中获取原始输出,它最终还是会漂亮地打印 XML 有效负载。所以 XML 有效负载是 html 编码的,所以它没有发送“<... soapui> 【参考方案1】:

该部分是处理指令。按照 https://www.w3.org/TR/REC-xml/#sec-pi 和 https://www.w3.org/TR/REC-xml/#sec-prolog-dtd 您可以看到文档的开头是序言,并且对于文档期间的处理指令,PITarget 可能是除 xml 之外的任何内容。因此,兼容的解析器无法再解析您的文档。

如果您认为上述内容是对方需要的,请尝试将您的文档序列化为文本节点并将其添加为 xmlRequest 的内容。它看起来像

<xmlRequest>&lt;?xml ...

或者,您可以尝试将您的文档序列化为 CDATA 部分 (https://www.w3.org/TR/REC-xml/#sec-cdata-sect),但对我来说,这与您的感觉同样错误。而且你已经尝试过我的建议了。

毕竟 XMLdecl 是可选的 (https://www.w3.org/TR/REC-xml/#NT-prolog)。您是否尝试过在 XSLT 中使用它来省略 xml 声明?

<xsl:output method="xml" omit-xml-declaration="yes" />

如果这一切都不起作用,其他客户端如何发送数据?他们的消息是怎样的?

【讨论】:

是的,我知道这是一个处理指令,这就是为什么我在中间指出它是非法的。 很好,我们同意这一点。那么其他客户如何实际使用该服务呢?如果你不能,我怀疑他们可以发送非法数据。 见上面的评论。

以上是关于使用连接到 WCF 服务的 Java 客户端在 XML 正文中嵌入 XML 指令的主要内容,如果未能解决你的问题,请参考以下文章

WCF 连接到 Websocket 服务器

使用 gSOAP 连接到 WCF Web 服务

如何以编程方式将客户端连接到 WCF 服务?

VB6 连接到 WCF

无法连接到我的Localhost上的WCF服务

当客户端甚至无法连接到 WCF 服务器时,为啥会出现“服务器堆栈跟踪”异常?