68

MTOM 是 W3C 消息传输优化机制,它是一种有效地向 Web 服务发送二进制数据和从 Web 服务发送二进制数据的方法。

它一般是如何工作的?

4

3 回答 3

166

这一切都始于 SOAP 是XML的事实。当您发送文本以外的任何内容时,例如,图像 - 它必须转换为 XML 处理器可以理解的数据类型。

如果没有 MTOM,您的图像将被转换为base64Binary并放置在 SOAP 信封的中间。这种转换过程使数据变胖。

<tns:data>一个非常棒的 base64Binary 字符串</tns:data>

这是一个简单的例子:

在此处输入图像描述

使用 MTOM,图像将作为MIME 附件在信封传输- 简而言之,它是根据其原始数据类型发送的:jpg、png 或 gif。当然它仍然是作为二进制数据传输的,但是这次没有与 XML 相关的转换,避免了计算开销。XOP 出现在图片中,因为它提供了外化图像的位置。

<soap:Envelope>
    <soap:Body>
        <tns:data>
            <xop:include href="SomeUniqueID-ThatLeadsToTheImage"/>
        </tns:data>
    </soap:Body>
</soap:Envelope>

内容 ID:“SomeUniqueID”
内容类型:image/png

此处为图像二进制数据

于 2013-03-22T14:06:51.507 回答
52

如果您将Wireshark(或启用System.Net Logging)放在未启用 MTOM 的服务上,您应该会看到 SOAP 请求的二进制数据编码为 BASE64。将其作为 BASE64 发送会增加二进制数据的大小,但(我假设)使其更具互操作性。

使用 MTOM,SOAP 消息作为 MIME 消息发送,其中 BASE64 编码被替换为占位符。然后将二进制数据放在定界符之间(每条二进制数据都会这样),然后放在 SOAP 请求的末尾。然后二进制数据未经编码发送。IIRC,MTOM 还确定将其作为 MIME 消息发送是否会增加 SOAP 调用的大小,如果不提供保存,它将作为普通 SOAP 消息发送。

提供了一个通过网络发送的消息的示例。

于 2008-10-19T16:06:17.640 回答
11

还有一些其他答案没有提到的因素。有人可能会想为什么不使用 MTOM 作为默认值,因为它比文本消息编码(Base64)“更快” 。这是因为 MTOM 并不总是更快。MTOM 应该只用于大型消息传输,因为它会带来开销。对于小尺寸的消息,MTOM 的性能会比文本消息编码(Base64)差。

如果 MTOM 用于大型消息,它比 Base64 更快,因为它使用原始二进制文件进行数据传输。要理解这一点,应该了解 Base64 的工作原理。

Base64 使用6 位 (log2(64))来表示1 个字符,这意味着 base64 使用4 个字符来表示 24 位(3 个字节)。因此,如果消息大小为n 字节,base64 将使用4*(n/3) 字节来表示您的数据,这意味着它将比 MTOM慢 1/3 。

于 2016-12-13T11:51:24.050 回答