MTOM 简介:实践方法





0/5 (0投票)
通过构建一个简单的原型来学习如何使用 MTOM。
这是我们对 The Code Project 赞助商的展示性评测。这些评测旨在为您提供我们认为对开发人员有用且有价值的产品和服务信息。
MTOM 简介:实践方法
通过构建一个简单的原型来学习如何使用 MTOM。
MTOM 概述
随着基于 Web 服务的 SOA 部署到全球 2000 强企业,使用 SOAP 消息传输附件(如 MRI 扫描、X 射线、设计文档和商业合同)已成为常见做法。SOAP 消息传输优化机制 (MTOM) 是 W3C 推荐标准,旨在优化附件的电子传输。通过电子传输文档,公司可以通过消除邮政邮件的使用,实现显著的成本节约和更好的服务水平。基于纸张的手动任务可以替换为简单高效的电子流程,其中二进制数据可以通过 MTOM 等标准在组织之间传输。
MTOM 提供了一种优雅的机制,可以高效地在系统之间传输二进制数据——例如图像、PDF 文件和 Microsoft Word 文档。下图显示了使用 MTOM 在消费者和生产者之间传输数据的步骤。

消费者应用程序首先发送一个包含 Base64Binary 编码格式的复杂数据的 SOAP 消息。Base64Binary 数据类型以 65 个文本字符表示任意数据(例如图像、PDF 文件、Word 文档),这些字符可以作为 SOAP 消息元素的一部分显示。对于上图中发送 SOAP 消息的步骤 1,一个包含 Base64Binary 编码元素 <tns:data>
的示例 SOAP 正文如下:
<soap:Body>
<tns:ByteEcho>
<tns:data>JVBERi0xLjYNJeLjz9MNCjE+DQpzdGFyNCjEx0YNCg==</tns:data>
</tns:ByteEcho>
</soap:Body>
一个支持 MTOM 的 Web 服务引擎会检测 Base64Binary 编码数据类型的存在(在我们的示例中是 <tns:data>
),并根据数据大小做出决策,将 Base64Binary 数据转换为 MIME 数据,其内容类型为 XML-binary Optimization Package (xop)。数据转换(如上图步骤 2 所示)导致 Base64Binary 数据被替换为 <xop:Include>
元素,该元素引用正在传输文档的原始字节。原始字节被附加到 SOAP 消息中,并由 MIME 边界分隔,如下所示:
<soap:Envelope>
<soap:Body>
<tns:ByteEcho>
<tns:data><xop:Include href="cid:1.633335845875937500@example.org"/></tns:data>
</tns:ByteEcho>
</soap:Body>
</soap:Envelope>
--MIMEBoundary000000
content-id: <1.633335845875937500@example.org>
content-type: application/octet-stream
content-transfer-encoding: binary
原始二进制数据,连同 SOAP 消息和 MIME 边界,通过网络传输到生产者。然后,生产者将原始二进制数据转换回 Base64Binary 编码以进行进一步处理。通过 Base64Binary 和原始二进制 MIME 类型之间的这种转换,MTOM 提供了两个显著的优势:
- 高效传输:Base64Binary 编码数据比使用 MIME 的原始字节传输大约 33%。因此,MTOM 通过将 Base64Binary 编码转换为原始字节进行传输来减少数据膨胀。
- 处理简单性:Base64Binary 编码数据由 65 个文本字符组成。数据表示在 SOAP 消息的一个元素中。安全标准(如 WS-Signatures 和 WS-Encryption)可以直接应用于 SOAP 消息。一旦执行了此类操作,Base64Binary 数据可以转换为原始字节以进行高效传输。因此,通过 SOAP 保护文档传输不需要额外的标准来保护基于 MIME 的附件。
在本文中,我们将部署一个用于处理二进制数据的 Web 服务 ByteEcho(byte[] data)
,并检查在不启用 MTOM 和启用 MTOM 的情况下使用此服务。
设置和安装概述
为了动手理解 MTOM,我们将构建具有简单操作的 Web 服务,该操作将回显字节流。在本节中,我们将重点通过安装以下组件来设置 MTOM 的 SOA 测试框架。请按列出的顺序安装以下三个产品:
- Crosscheck Networks SOAPSonar Enterprise Edition:一个基于 .NET 的 SOAP 客户端,用于全面的 Web 服务测试。安装 SOAPSonar 安装程序将要求您安装的先决条件,例如如果您的计算机上尚未安装 .NET Framework 2.0。
- Web Service Enhancements (WSE) 3.0 for Microsoft .NET Framework:这是 Microsoft .NET Framework 2.0 的一个附加组件,使开发人员能够基于最新的 Web 服务协议规范(如 MTOM)构建安全的 Web 服务。注意:在安装过程中,请选择开发人员版本选项。
- Microsoft .NET WebMatrix:此安装程序包含一个用于构建 Web 服务的 IDE 和一个轻量级 Web 服务器。
所有三个组件都可以安装在具有适度资源的 Windows 2000/XP/2003/Vista 机器上。Web 服务生产者是 .NET WebMatrix 服务器,它提供一个带有 ByteEcho(byte[] data)
操作的 Web 服务,应用程序可以通过 HTTP 调用该操作。此外,它还生成定义 Web 服务接口的 WSDL 文件。此文件为消费者 SOAPSonar 提供了所有必要的信息,以便向目标 Web 服务发送 SOAP 请求。SOAPSonar 消费并解释生产者发布的基于 WSDL 的 API 并调用 Web 服务。
构建用于二进制数据的 Web 服务
要构建一个演示如何处理二进制数据的简单 Web 服务,请按照以下步骤操作:
-
转到:开始 > 所有程序 > Microsoft ASP .NET Web Matrix > ASP .NET Web Matrix。
-
您将看到如下所示的屏幕。填写所示信息。在左侧面板中选择“Web Services”,在右侧面板中选择“Simple”模板。创建一个 _C:\WebServices_ 文件夹来存储 _*.asmx_ 文件并选择 C#。
注意:直到此面板上的所有信息都填写完毕,“确定”按钮才会变为灰色。
-
这将自动为您生成一个带有
Add(int a, int b)
操作的 Web 服务,如下所示。我们将保留此自动生成的操作,并在下一步中包含一个新的字节处理操作。 -
将以下代码剪切并粘贴到 Web Matrix IDE 中,紧邻
Add(int a, int b)
操作下方:[WebMethod] public byte [] ByteEcho(byte[] data) { return data; }
-
IDE 将如下所示:
-
点击 IDE 中的“播放”按钮,它将提示您在端口 8080 上启动 Web 应用程序。您的本地防火墙可能会阻止您在端口 8080 上启动侦听器。将该端口添加到防火墙允许端口列表中。
-
将出现一个带有 Add 和 ByteEcho 操作的网页浏览器。您可以点击此按钮并开始使用 Add 操作。ByteEcho 操作不接受来自浏览器的输入。
SOAPSonar 设置
要设置 SOAPSonar 测试客户端,请执行以下步骤:
-
转到:开始 > 所有程序 > Crosscheck Networks > SOAPSonar Enterprise Edition 3 > SOAPSonar Enterprise,启动 SOAPSonar。
-
将发布在 .NET WebMatrix 端点 _https://:8080/BinaryProcess.asmx?WSDL_ 的 WSDL 加载到 SOAPSonar 中,如下图所示。在左侧的项目树面板中选择 ByteEcho_1 测试用例。右键单击数据字段并选择“内容功能 > Base64Encode”。将弹出文件对话框,使您能够从系统中选择一个文件,例如 PDF 或 JPEG 文件。文件名将以 `$b64:file` 前缀嵌入到数据字段中。
点击
提交更改,点击
执行测试。您将在“响应”面板中看到 SOAP 响应。
-
通过“文件”>“项目另存为”保存项目。
-
点击“请求”面板中的
以查看请求的头部信息。选择“发送请求”选项卡,如下图所示。SOAP 请求和头部信息也显示在下方。请注意以下信息:
- 标头内容长度为 324771 字节。这将根据您选择的文件而异。
- 内容类型为 text/XML。启用 MTOM 后会更改。
- 数据字段包含所选二进制文件的 base64Encoded 值。
到目前为止,您已成功将 WSDL 加载到测试客户端 SOAPSonar 中,并设置了一个简单的消费者(SOAPSonar)到生产者(webMatrix)框架,该框架将 base64Encoded 字节发送到 webMatrix 服务器,然后 webMatrix 服务器在 SOAP 响应中将字节反射回 SOAPSonar。接下来,我们将启用 MTOM 并审查其对 SOAP 请求和响应的影响。
启用 MTOM
在本节中,我们将为 WebMatrix 和 SOAPSonar 测试客户端启用 MTOM。按以下步骤为 WebMatrix 启用 MTOM:
-
转到:_C:\Program Files\Microsoft WSE\v3.0\Tools_ 并启动 _WseConfigEditor3.exe_。
-
使用 WSE 3.0 配置工具,选择“文件”菜单打开位于 _C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG_ 的 _web.config_ 文件。
-
在“常规”选项卡下,勾选两个复选框以启用 WebMatrix 服务器的 WSE 3.0,如下图所示。
-
接下来,选择“消息传递”选项卡,并将“服务器模式 MTOM 设置”设置为“始终”。
-
转到:文件 > 保存以保存新配置并退出 WSE 3.0 配置工具。
-
使用文本编辑器检查 _web.config_ 文件,并确保 _web.config_ 文件中出现以下元素。正如预期的那样,MTOM 的 serverMode 值设置为“always”。服务器现在将只接受 MTOM 编码的消息。如果 WebMatrix 收到一个非 MTOM 的 SOAP 请求,则会向发送方返回 HTTP 错误 415:“不支持的媒体”。
<messaging> <mtom clientMode="Off" serverMode="always"/> </messaging>
-
重新发送 base64Encoded SOAP 请求。由于 WebMatrix 收到一个非 MTOM 消息,SOAPSonar 将收到一个 HTTP 错误 415:“不支持的媒体”,如“响应”面板中所示。
-
在项目树中,点击“策略设置”节点。将 MTOM 设置 - 客户端模式更改为“开”,如下图所示。这将使 SOAPSonar 能够发送 MTOM 编码消息。点击以提交更改。
-
转到 ByteEcho_1 测试用例,点击
执行测试。通过点击“请求”面板中的“发送请求”选项卡来查看发送到服务器的请求。SOAP 请求和头部信息也显示在下方。请注意以下信息:
- 标头内容长度为 244093 字节。这将根据您选择的文件而异。
- 内容类型是 application/xop+xml。这表示 SOAPSonar 正在生成 MTOM 消息。
- 数据字段包含 MIMEBoundary 内容传输编码。
注意:启用 MTOM 后,消息请求的头部内容长度为 244K,而未启用 MTOM 的消息请求为 325K。即使对于中等大小的消息,这也相当于消息大小减少了约 25%。
-
转到上面步骤 8 所示的面板,并勾选 MTOM 设置中的“显示原始响应”。这将关闭二进制到文本的编码,并使您能够在响应面板中查看原始二进制内容。
现在,您应该能够熟练地向测试服务器发送 Base64Binary 编码和 MTOM 编码消息,并以原始格式和 Base64Binary 编码格式查看响应。
结论
MTOM 提供了一种高效传输二进制数据的机制。MTOM 通过减少传输所需的标准数量,同时减少由 Base64Binary 编码整个附件导致的数据膨胀,使其成为传输大型二进制内容的理想标准。显然,没有什么东西是免费的。通过减少“网络足迹”提高网络传输效率是以牺牲 CPU 资源为代价的。客户端必须花费处理资源将 Base64Binary 编码类型转换为 MIME 类型,然后才能通过网络传输。接收方然后执行从 MIME 到 Base64Binary 数据的另一种数据类型转换。MTOM 非常适合用于大量外部组织希望通过低带宽互联网向企业传输大量文档的情况。