MTOM 是 W3C 消息传输优化机制,它是一种有效地向 Web 服务发送二进制数据和从 Web 服务发送二进制数据的方法。
它一般是如何工作的?
这一切都始于 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此处为图像二进制数据
如果您将Wireshark(或启用System.Net Logging)放在未启用 MTOM 的服务上,您应该会看到 SOAP 请求的二进制数据编码为 BASE64。将其作为 BASE64 发送会增加二进制数据的大小,但(我假设)使其更具互操作性。
使用 MTOM,SOAP 消息作为 MIME 消息发送,其中 BASE64 编码被替换为占位符。然后将二进制数据放在定界符之间(每条二进制数据都会这样),然后放在 SOAP 请求的末尾。然后二进制数据未经编码发送。IIRC,MTOM 还确定将其作为 MIME 消息发送是否会增加 SOAP 调用的大小,如果不提供保存,它将作为普通 SOAP 消息发送。
这提供了一个通过网络发送的消息的示例。
还有一些其他答案没有提到的因素。有人可能会想为什么不使用 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 。