【问题标题】:How do I mark SOAP service 'MTOM enabled'如何将 SOAP 服务标记为“已启用 MTOM”
【发布时间】:2017-02-18 22:32:14
【问题描述】:

这不是 Java 特定的问题,但让我们举一个 Java 中的示例:在 Java 世界中,将xmime:expectedContentTypes="*/* 添加到 base64 元素以在服务器端启用 MTOM 处理是 Java 世界的标准做法 - 它会导致 @987654322 @注解,使用DataHandlers而不是字节数组等。虽然这个描述当然大大简化了,xmime:expectedContentTypes="*/*通常被开发人员(更重要的是实现库)识别为“MTOM就绪”在架构中。根据我从示例中收集到的信息,C# 世界的情况也是如此。

但它对我来说毫无意义——该属性指定了我们在 XML 中实际期望的数据类型,而不是它可以与 MTOM 一起使用。在 SOAP 1.1 的任何 RFC 或类似文档中,我也没有发现预期内容类型和 MTOM 之间的任何直接联系。

我的问题可以用两种方式表达:

  1. 服务如何明确表示它接受/提供二进制数据作为请求/响应中的 MTOM 附件?
  2. 客户端如何正确识别二进制数据可以通过使用给定服务的 MTOM 附件发送/获取?

【问题讨论】:

    标签: soap wsdl mtom


    【解决方案1】:

    您似乎对附件、SOAP 附件和 MTOM 有点混淆。

    SOAP-Attachment 最初是在December 2000 as a W3C note(不是规范)中引入的,它定义了对 SOAP 1.1 中定义的传输绑定机制的扩展。特别是,此注释定义:

    要在 MIME 多部分/相关消息中承载的 SOAP 1.1 消息的绑定,以保留 SOAP 1.1 消息的处理规则的方式。用于封装复合文档的 MIME 多部分机制可用于捆绑与 SOAP 1.1 消息相关的实体,例如附件。

    简单来说,它定义了一种机制,用于使用多部分 mime 结构进行传输,使多个文档(附件)以其本机格式与 SOAP 消息相关联。这是使用combination of "Content-Location" and "Content-ID" headersset of rules 来实现的,用于解释“Content-Location”标头引用的URI。

    这种格式的 SOAP 消息可视化如下(封装为 multipart/mime):

    这也是您在使用 SAAJ 时可能使用过的格式,但不再推荐使用,除非您使用的是遗留代码。 W3C 注释后来在 2004 年被修改为“特性”级别(与 SOAP 1.2 一起),并且通过 SOAP MTOM 机制为eventually superseded

    官方将 SOAP 消息传输优化机制 (MTOM) 定义为不是一种,而是three separate features 协同工作以提供功能:

    1. "Abstract SOAP Transmission Optimization Feature" 描述了一种抽象功能,用于通过选择性地编码消息的各个部分来优化 SOAP 消息的传输和/或有线格式,同时仍向 SOAP 应用程序呈现 XML 信息集。

    2. "An optimized MIME Multipart/Related serialization of SOAP Messages" 描述了一种优化的 MIME 多部分/相关的 SOAP 消息序列化,以独立于绑定的方式实现抽象 SOAP 传输优化特性。

    3. "HTTP SOAP Transmission Optimization Feature" 描述了 SOAP 1.2 HTTP 绑定的抽象传输优化功能的实现。

    如果您阅读第二个文档,您会发现“附件”已被替换为XML binary optimized "packages" 或 XOP。

    XOP 包是通过将 XML 信息集的序列化放入可扩展的打包格式(例如 MIME Multipart/Related,参见 [RFC 2387])中来创建的。然后,提取其内容的选定部分,即 base64 编码的二进制数据并重新编码(即,数据从 base64 解码)并放入包中。这些选定部分的位置在 XML 中使用特殊元素进行标记,该元素使用 URI 链接到打包数据。

    简单来说,这意味着不再将数据封装为多部分/mime 消息中的“附件”,而是现在通过“指针”或链接来引用数据。以下图表可能有助于理解:

    现在我们有了背景,让我们回到您的问题。

    1. 服务如何明确表示它接受/提供二进制数据作为请求/响应中的 MTOM 附件? 它不是。 MTOM 没有附件的概念,因此服务器不能声明它接受附件。

    2. 客户端如何正确识别二进制数据可以通过使用给定服务的 MTOM 附件发送/获取? 就像我上面说的,客户端无法执行此操作,因为不支持“附件”。

    话虽如此,XML media types 上还有另一个 W3C 规范声明:

    xmime:contentType 属性信息项允许 Web 服务应用程序优化由二进制元素信息项定义的二进制数据的处理,应将其视为元数据。 xmime:contentType 属性的存在不会改变元素内容的值。

    当您使用 xmime:contentTypexmime:expectedContentTypes="application/octet-stream (* should not be used) 启用 MTOM 时,生成的 WSDL 将具有如下条目:

    <element name="myImage" xmime:contentType="xsd:base64Binary" xmime:expectedContentTypes="application/octet-stream"/> 这是服务器声明它可以接收 XML 二进制优化包(可以分解为多部分 MIME 消息)的方式。

    当客户端看到上述内容时,客户端知道服务器可以接受 XML 二进制优化包并生成适当的 HTTP 请求,如定义 Identifying XOP Documents

    在类似 MIME 的系统中使用 XOP 文档时,使用“application/xop+xml”媒体类型进行标识,所需的“type”参数传达原始 XML 序列化的相关内容类型。

    希望有帮助!

    【讨论】:

      猜你喜欢
      • 2021-05-27
      • 2016-06-09
      • 2014-05-30
      • 2012-09-09
      • 2016-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多