2016-10-10 48 views
1

这不是Java特定的问题,但让我们举一个Java示例:在Java世界中将xmime:expectedContentTypes="*/*添加到base64元素以启用服务器上的MTOM处理是标准做法这样做会导致@XmlMimeType批注,使用DataHandler而不是字节数组等等。尽管这个描述当然被大大简化了,但xmime:expectedContentTypes="*/*通常被开发人员认为是'MTOM ready'(更重要的是也被实现的库)当在模式中看到时。从我从例子中得到的结果来看,C#世界的情况是一样的。如何标记SOAP服务“启用MTOM”

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

我的问题可以从两个方面来表述:

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

回答

5

看来你在附件,SOAP附件和MTOM之间有些混淆。

SOAP-Attachment在December 2000 as a W3C note(不是规范)中首次引入,并定义了对SOAP 1.1中定义的传输绑定机制的扩展。具体地讲,本说明中所定义:

一个用于SOAP绑定1.1消息到MIME多部分/相关消息内以这样的方式来进行,对于SOAP 1.1消息的处理规则是preserved.The MIME多机构用于封装复合文档可用于捆绑与SOAP 1.1消息相关的实体,如附件。

简单来说,它定义为使用多部分MIME结构运输多个文档(附件)将与SOAP消息在其原生格式相关联的机制。这是通过使用combination of "Content-Location" and "Content-ID" headers以及set of rules来解释由“Content-Location”头引用的URI来实现的。

这种格式的SOAP消息,可以看作以下(封装成多/ 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应用呈现XML信息集。

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

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

如果你读了第二份文件,你会发现,“附件”已被替换为XML binary optimized "packages"或XOP。

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

简而言之,这意味着不是将数据作为“附件”封装在multipart/mime消息中,而是现在通过“指针”或链接引用数据。下面的图表可以帮助理解:

enter image description here

现在,我们有后台,让我们回到你的问题。

  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

XOP文档,在MIME类系统中使用时,与被识别“application/xop + xml”媒体类型,带有所需的“type”参数,用于传递原始XML序列化的关联内容类型。

希望有所帮助!

相关问题