【发布时间】:2010-09-17 23:04:47
【问题描述】:
MTOM 是 W3C 消息传输优化机制,是一种有效地将二进制数据发送到 Web 服务和从 Web 服务发送出的方法。
一般来说它是如何工作的?
【问题讨论】:
MTOM 是 W3C 消息传输优化机制,是一种有效地将二进制数据发送到 Web 服务和从 Web 服务发送出的方法。
一般来说它是如何工作的?
【问题讨论】:
这一切都始于 SOAP 是 XML 的事实。当您发送文本以外的任何内容时,例如,图像 - 它必须转换为 XML 处理器可以理解的数据类型。
没有 MTOM,您的图像将被转换为 base64Binary 并放置在 SOAP 信封的中间。这种转换过程使数据变胖。
非常棒的base64Binary字符串
这是一个简单的例子:
使用 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这里是图片二进制数据
【讨论】:
有一些其他答案没有提到的因素。有人可能会想为什么不使用 MTOM 作为默认值,因为它比文本消息编码(Base64)“更快”。这是因为 MTOM 并不总是更快。 MTOM 应该只用于大型消息传输,因为它会带来开销。对于小消息,MTOM 的性能会比 Text message encoding (Base64) 差。
如果 MTOM 用于大型消息,它比 Base64 更快,因为它使用原始二进制文件进行数据传输。要理解这一点,应该了解 Base64 的工作原理。
Base64使用6位(log2(64))来表示1个字符,也就是说base64使用4个字符来表示24位( 3 个字节)。因此,如果消息大小为 n 字节,base64 将使用 4*(n/3) 字节 来表示您的数据,这意味着它将 慢 1/ 3 比 MTOM。
【讨论】:
如果您将Wireshark(或启用System.Net Logging)放在未启用MTOM 的服务上,您应该会看到二进制数据编码为BASE64 的SOAP 请求。将其作为 BASE64 发送会增加二进制数据的大小,但(我认为)使其更具互操作性。
使用 MTOM,SOAP 消息作为 MIME 消息发送,其中 BASE64 编码被替换为占位符。然后将二进制数据放在定界符之间(每条二进制数据都会这样),然后放在 SOAP 请求的末尾。然后二进制数据未经编码发送。 IIRC,MTOM 还确定将其作为 MIME 消息发送是否会增加 SOAP 调用的大小,如果不提供保存,它将作为普通 SOAP 消息发送。
This 提供了通过网络发送的消息的示例。
【讨论】: