【问题标题】:Make MTOM Optional使 MTOM 可选
【发布时间】:2016-06-05 11:05:23
【问题描述】:

我正在使用 Tomcat、Apache CXF 和 Spring Boot 公开一个 SOAP 服务。 Web 服务已启用 MTOM,并且在通过 SOAP UI 对其进行测试时可以正常工作。

问题是,当我尝试从 SOAP UI 中获取禁用 MTOM 的消息时,我仍然会收到带有 XOP 附件的消息。我使用的 SOAP UI 选项是: Enable MTOM: false;强制 MTOM:false。

我尝试将请求的 Accept 标头设置为 application/xml 而不是 application/xop+xml,但我仍然得到相同的结果。

获得 Byte64 流的唯一时间是使用小于我设置的阈值的文件进行测试:

@MTOM(enabled = true, threshold = 2048)

我需要的是 MTOM 在设置为启用时是可选的,并且取决于请求,而不仅仅是阈值,这可能是 SOAP UI 的问题还是我当前的配置忽略了请求参数?

我需要这个,因为 Web 服务的某些客户端不支持 MTOM。

这是我从暴露方法返回的对象:

public class Document {

    private DataHandler fileData;

    public DataHandler getFileData() {
        return fileData;
    }

    public void setFileData(DataHandler fileData) {
        this.fileData = fileData;
    }
}

【问题讨论】:

    标签: web-services tomcat soap jax-ws mtom


    【解决方案1】:

    无法从客户端控制是否希望服务器使用 xop 附件进行响应。

    JAX-WS,我认为它的任何实现(例如 CXF)都不关心 Accept 标头,因为它没有在 SOAP 规范中指定服务器必须从请求中读取,也没有指定它的值应该写在回复上。因此,如果您输入 application/xmltext/xml 或其他任何名称,都没有区别。

    如果服务器启用了 MTOM,则它必须始终(只要它在阈值范围内)使用 MTOM 发回soap 响应。

    我使用的 SOAP UI 选项是: Enable MTOM: false;强制 MTOM:错误

    这些是请求消息的选项,因此如果您在请求中发送文件,它将被编码为 base64 附件,这意味着您只是为请求禁用 MTOM。

    这很糟糕,但基本上你只剩下两个选择:

    • 修改服务器并禁用 MTOM 或尝试使用拦截器执行某些操作,例如从请求中读取值并基于该值以编程方式为该单个消息启用/禁用 mtom。这就像为自己实现一个机制来决定客户端是否支持 MTOM。

    • 修改不支持 MTOM 的客户端,如果您问这个问题,您可能无法做到。

    【讨论】:

    • 感谢您的回复,经过几个小时的搜索和测试,我得出了相同的结论。
    猜你喜欢
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 2011-06-15
    • 2014-04-10
    • 2018-07-01
    • 2016-03-30
    • 2014-04-07
    相关资源
    最近更新 更多