如何标记SOAP服务“启用MTOM”

时间:2016-10-10 13:23:45

标签: soap wsdl mtom

这不是Java特有的问题,但让我们在Java中有一个例子:Java世界中的一个标准做法是将xmime:expectedContentTypes="*/*添加到base64元素以在服务器端启用MTOM处理 - 它导致@XmlMimeType注释,使用DataHandler而不是字节数组等。虽然此描述当然大大简化,但xmime:expectedContentTypes="*/*通常被开发人员认为是“MTOM就绪”(更重要的是也可以通过实现库)在架构中看到。从我从示例中收集的内容来看,C#世界的情况是一样的。

然而,对我来说没有任何意义 - 该属性指定我们可能在XML中实际期望的数据类型,而不是它可以与MTOM一起使用。我还没有在SOAP 1.1的任何RFC或类似文档中找到预期内容类型和MTOM之间的任何直接连接。

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

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

1 个答案:

答案 0 :(得分:5)

在附件,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):

enter image description here

这也是您在使用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"描述了以绑定无关方式实现抽象SOAP传输优化功能的SOAP消息的优化MIME多部分/相关序列化。

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

  4. 如果您阅读第二份文件,您会发现"附件"已被XML binary optimized "packages"或XOP取代。

      

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

    简单来说,这意味着不是将数据封装为"附件"在multipart / mime消息中,数据现在由"指针"或链接。以下图表可能有助于理解:

    enter image description here

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

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

    2. 客户如何正确识别可以使用给定服务的MTOM附件发送/获取二进制数据? 就像我上面所说的那样,客户无法做到这一点,因为"附件"不受支持。

    3. 话虽如此,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二进制优化包并按照定义Identifying XOP Documents生成适当的HTTP请求:

        

      XOP文档在类似MIME的系统中使用时,使用&#34; application / xop + xml&#34;媒体类型,具有所需的&#34;类型&#34;传达原始XML序列化的相关内容类型的参数。

      希望有所帮助!

相关问题