MTOM是W3C消息传输优化机制,一种有效地向Web服务发送二进制数据的方法。
一般情况如何?
答案 0 :(得分:145)
这一切都始于SOAP XML 这一事实。当您发送除文本之外的任何内容(例如图像)时,必须将其转换为XML处理器可以理解的数据类型。
如果没有MTOM,您的图片将转换为 base64Binary ,并放置在SOAP信封的中间。此转换过程使数据变胖。
< tns:data>非常looooooooooooooooooooong 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>
Content-id:&#34; SomeUniqueID&#34;
内容类型:image / png图像二进制数据
答案 1 :(得分:47)
如果在非MTOM启用的服务上放置Wireshark(或启用System.Net Logging),您应该看到SOAP请求的二进制数据编码为BASE64。将其作为BASE64发送会增加二进制数据的大小,但(我假设)使其更具互操作性。
使用MTOM,SOAP消息将作为MIME消息发送,BASE64编码将替换为占位符。然后将二进制数据放在分隔符之间(对于每个二进制数据发生),然后放在SOAP请求的末尾。然后以未编码的形式发送二进制数据。 IIRC,MTOM还确定将它作为MIME消息发送是否会增加SOAP调用的大小,如果不提供保存,它将把它作为普通的SOAP消息发送。
This提供了通过网络发送的消息的示例。
答案 2 :(得分:8)
其他答案中没有提及的因素有哪些。有人可能会认为为什么没有使用MTOM作为默认值,因为它比文本消息编码(Base64)更快&#34; 。这是因为MTOM并不总是更快。 MTOM应该只用于大型消息传输,因为它带来了开销。对于小尺寸的消息,MTOM的性能将比文本消息编码(Base64)更差。
如果MTOM用于大型消息,它比Base64更快,因为它使用原始二进制文件进行数据传输。要理解这一点,应该了解Base64的工作原理。
Base64使用 6位(log2(64))来表示 1个字符,这意味着base64使用 4个字符来表示24位( 3个字节)。因此,如果邮件大小为 n字节,则base64将使用 4 *(n / 3)字节来表示您的数据,这意味着它将慢1 / 3 比MTOM。