MTOM是如何工作的?

71

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

总体上,它是如何工作的呢?

3个回答

177

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

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

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

这里是一个简单的说明:

enter image description here

使用MTOM,图像将作为MIME附件以其原始数据类型(即jpg、png或gif)发送,位于信封之外。当然,它仍然以二进制数据传输,但这次没有与XML相关的转换,从而避免了计算开销。 XOP则会给出外部化图像的位置。

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

内容标识: "SomeUniqueID"
内容类型: image/png

这里是图像二进制数据


你有这个的任何示例代码吗?实际上,我需要了解在<xop:include href="SomeUniqueID-ThatLeadsToTheImage"/>中包含什么。我对此有些困惑。 - Arpit Kulsreshtha
11
很好的插图。香蕉符号也很有趣和娱乐性。Mtom简直太棒了。 - Tore Aurstad
简化示例。谢谢! - Karan
当图片胜过千言万语。谢谢。 - Rok Prodan
XOP是否可以包含图像URL,以便客户端无需下载/包含图片在内存中?而服务器本身可以下载它?或者我是希望小说成为现实,没有有效的方法快速发送大型图像?所有传统的JAXB类都会在带有约1.5 MB图像的几个RPS的情况下完全破坏我们的反应堆应用程序:crying:。 - Aubergine
要引用 Content-ID: "SomeUniqueID",可以使用 <xop:include href="cid:SomeUniqueID" />(其中 cid 指的是另一个消息部分的 Content-ID 标头),而这种 HTTP 请求的 Content-Type 标头看起来类似于 Content-Type: multipart/related; type="application/xop+xml"; start="root-Content-ID"; start-info="text/xml"; boundary="my-multipart-boundary" - gknicker

55
如果您在非MTOM启用的服务上放置Wireshark(或启用System.Net Logging),则应该看到将二进制数据编码为BASE64的SOAP请求。将其作为BASE64发送会增加二进制数据的大小,但(我假设)使其更具互操作性。
使用MTOM时,SOAP消息将作为MIME消息发送,并将BASE64编码替换为占位符。然后,在分隔符之间放置二进制数据(对于每个二进制数据片段都会这样处理),然后将其放置在SOAP请求末尾。然后发送未编码的二进制数据。如果我没记错,MTOM还确定是否将其作为MIME消息发送会增加SOAP调用的大小,如果不提供节省,则将其作为普通SOAP消息发送。 This提供了发送到线路的消息的示例。

7
“二进制数据随后被放置在分隔符之间”,或者可以将二进制数据的链接作为SOAP消息的一部分发送,以允许二进制数据存在XML之外并可供下载,例如,在HTTP/S服务器集群上进行性能优化。这称为“按引用”。 - Eric

12

在其他答案没有提到的几个因素中,有人可能会想为什么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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接