Jop*_*ops 150
这一切都始于SOAP是XML.当您发送除文本之外的任何内容(例如图像)时,必须将其转换为XML处理器可以理解的数据类型.
如果没有MTOM,您的图像将转换为base64Binary并放置在SOAP信封的中间.此转换过程使数据变胖.
<tns:data>一个非常looooooooooooooooooooooong 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>
Run Code Online (Sandbox Code Playgroud)
Content-id:"SomeUniqueID"
Content-Type:image/png图像二进制数据
Ric*_*ber 50
如果将Wireshark(或启用的System.Net日志记录)放在非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.