消息传输优化机制
SOAP 消息传输优化机制 (MTOM) 是万维网联盟 (W3C) 开发的标准。MTOM 描述一个机制,该机制用于通过有选择地重新编码部分消息但仍向 SOAP 应用程序显示 XML 信息集来优化 SOAP 消息的传输或有线格式。
- 用 SOAP 有效内容中的基本 64 位直接插入进行编码。然而,编码直接插入会增大 SOAP 消息的大小。请注意,基本 64 位编码可能是二进制数据的两倍大。
- 使用 SOAP with Attachments (SwA) 并遵循 Web Services Interoperability Organization (WS-I) Attachments Profile 对消息进行编码。WebSphere® Application Server 当前支持此方法。
- 通过使用 XML 二进制优化打包 (XOP) 提供二进制消息传输的优化。优化仅可用于二进制数据或内容。MTOM 在 SOAP 和 MIME over HTTP 的上下文中使用 XOP。
XOP 定义了一种序列化机制,该机制用于具有不适合 SOAP 和 MIME 打包、但适合任何 XML 信息集和任何打包机制的二进制内容的 XML 信息集。这是 XML 的替代序列化,只是看上去像 MIME 多个部件/相关包,将 XML 文档用作根部件。除了基本 64 位编码的数据替换为对非基本 64 位编码的其中一个 MIME 部件的引用之外,该根部件与文档的 XML 序列化非常相似。此引用使您能够在与编码相关联的处理方面节省大量开销。编码是可将二进制数据直接嵌入 XML 世界的唯一方法。
如果禁用 MTOM 映射生成,就会禁用 XOP。如果禁用 XOP,就不能通过使用 MIME 附件发送二进制数据。而是像平时一样使用基本 64 位对二进制数据进行编码。
- SOAP 消息的优化传输或有线格式的抽象功能部件。因为在发送方、接收方和中间方的优化技术的描述和
SOAP 处理器的行为是通用的,并且不包括对 MIME、HTTP
等等的技术的引用;在这个意义上,此功能部件是抽象的。优化技术在有选择地对可作为 xs:base64Binary 数据类型的规范文字表示法访问的 SOAP 包络信息集的某些内容进行编码的同时,集中于确保 SOAP 处理器的 SOAP 包络信息集视图。
实现这些抽象功能部件需要两个方面的具体规范:优化的有线格式以及优化的有线格式在特定传输上如何流动。
- MTOM 规范的第二个部件解决序列化方面并标准地取决于 MIME 多个部件/相关 XOP 打包。该序列化方面就是 MTOM 与 XOP 相关之处。
- 作为具体 SOAP HTTP 绑定级别功能部件,MTOM 扩展序列化。此部件描述可如何使用 HTTP 绑定来传输存放 SOAP MTOM 消息的 XOP 包。此部件还对可能发生的将 SOAP MTOM 消息序列化为 XOP 包施加了一些限制,例如只能使用 XML 1.0。
Java™ API for XML Web Services (JAX-WS) 添加了对使用 MTOM 发送二进制数据附件的支持。JAX-WS 是新近重新设计的用于 Web Service 的 API 堆栈(包括 JAX-WS 2.0、JAXB 2.0 和 SAAJ 1.3)的中心部件。API 堆栈有时候称为集成堆栈。JAX-WS 用于替换 Web Service 和 Web 应用程序中的 JAX-RPC。
附加方法
- 通过值附加:在通过使用基本 64 位或十六进制文本编码方法(在 XML 模式中分别以数据类型 xs:base64Binary 和 xs:hexBinary 编码)以元素或属性的方式嵌入不透明数据内容时使用该技术。
- 通过引用附加:在通过使用 URI(在 XML 模式中以数据类型 xs:anyURI 编码)以元素或属性的方式在外部引用不透明数据内容时使用该技术。
另一种标准由万维网联盟 (W3C) 定义,称为 SOAP with Attachments (SwA)。SwA 开发为打包带附件的 SOAP 消息的方法。由于一些供应商不支持 SwA,可以用功能更强大的 MTOM 和 XOP 机制代替 SwA。SwA 与 MTOM 在概念上非常相似,都是将二进制数据编码为 MIME 文档中的 MIME 附件。使用 MIME 附件可提高传输大量二进制有效内容的性能。
- MTOM 使用称为 XOP 的标准,该标准定义存在于 SOAP 有效内容中的 XOP 引用。此引用指向包含二进制数据的 MIME 附件。
- 对于 MTOM,XOP 引用在逻辑上将二进制数据包括到 XML 信息集中。对于 SwA,href 指向不仅物理上在 XML 文档外部,逻辑上也未包括在其信息集中的数据。
- 对于 MTOM,可对二进制附件进行逻辑签署,就如它们是 SOAP XML 文档的一部分一样。
- 除了 IBM® 之外,Microsoft .NET 也支持 MTOM, 它消除了使用 SwA 时存在的一些互操作性问题。当协作提交者讨论建议的修改时,将互操作性看作主要目标。
SOAP 1.2 和 SOAP 1.1
SOAP 1.1 基于 XML 规范。SOAP 1.1 实现可能仍会存在几年。对于仍然运行 SOAP 1.1 的那些用户而言,现在有了将 MTOM 用于附件支持的可互操作方法。SAP、Oracle、Microsoft 和 IBM 已经已向 W3C 提交了用于 MTOM 1.0 的 SOAP 1.1 绑定规范,该规范定义了 MTOM 如何可以与 SOAP 1.1 有效内容配合使用。该规范详细说明了对 SOAP MTOM 和 XOP 规范进行的必要修改,而这些修改是将这些技术与 SOAP 1.1 成功配合使用所必需的。请参阅该规范以了解更多详细信息。
MTOM 是 SOAP V1.2 功能部件,它基于信息集。请参阅 XML 信息设置文档以了解更多信息。
没有 MTOM,无论用什么格式编码的数据都会用模式(基本 64 位或十六进制)描述,然后包含在 XML 文档中。以下示例显示了具有 <xsd:base64Binary> 元素的 SOAP 消息:
... other transport headers ...
Content-Type: text/xml; charset=UTF-8
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<sendImage xmlns="http://org/apache/axis2/jaxws/sample/mtom">
<input>
<imageData>R0lGODl ... more base64 encoded data ... KTJk8giAAA7</imageData>
</input>
</sendImage>
</soapenv:Body>
</soapenv:Envelope>
如果启用了 MTOM,表示附件的二进制数据就会作为 MIME 附件包括到 SOAP 消息中。以下示例显示具有附件数据的支持 MTOM 的 SOAP 消息:
... other transport headers ...
Content-Type: multipart/related; boundary=MIMEBoundaryurn_uuid_0FE43E4D025F0BF3DC11582467646812;
type="application/xop+xml"; start="<0.urn:uuid:0FE43E4D025F0BF3DC11582467646813@apache.org>";
start-info="text/xml"; charset=UTF-8
--MIMEBoundaryurn_uuid_0FE43E4D025F0BF3DC11582467646812
content-type: application/xop+xml; charset=UTF-8; type="text/xml";
content-transfer-encoding: binary
content-id:
<0.urn:uuid:0FE43E4D025F0BF3DC11582467646813@apache.org>
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<sendImage xmlns="http://org/apache/axis2/jaxws/sample/mtom">
<input>
<imageData>
<xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include"
href="cid:1.urn:uuid:0FE43E4D025F0BF3DC11582467646811@apache.org"/>
</imageData>
</input>
</sendImage>
</soapenv:Body>
</soapenv:Envelope>
--MIMEBoundaryurn_uuid_0FE43E4D025F0BF3DC11582467646812
content-type: text/plain
content-transfer-encoding: binary
content-id:
<1.urn:uuid:0FE43E4D025F0BF3DC11582467646811@apache.org>
... binary data goes here ...
--MIMEBoundaryurn_uuid_0FE43E4D025F0BF3DC11582467646812--