Как работает MTOM? - PullRequest
       31

Как работает MTOM?

62 голосов
/ 19 октября 2008

MTOM - это механизм оптимизации передачи сообщений W3C, метод эффективной отправки двоичных данных в веб-службы и из них.

Как это вообще работает?

Ответы [ 3 ]

145 голосов
/ 22 марта 2013

Все начинается с того, что SOAP - это XML . А когда вы отправляете что-либо, кроме текста, например, изображение, - оно должно быть преобразовано в тип данных, понятный процессору XML.

Без MTOM ваше изображение будет преобразовано в base64Binary и помещено в середине вашего конверта SOAP. Этот процесс преобразования делает данные жирными.

Очень недоооооооооооооооооооооооооо64-битная строка64 / двоичные данные </ 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>

Content-id: "SomeUniqueID"
Тип контента: изображение / png

здесь представлены двоичные данные

47 голосов
/ 19 октября 2008

Если вы поместите Wireshark (или включите System.Net Logging ) в службу без поддержки MTOM, вы должны увидеть запросы SOAP с двоичными данными, закодированными как BASE64. Отправка его как BASE64 увеличивает размер двоичных данных, но (я полагаю) делает их более совместимыми.

При использовании MTOM сообщения SOAP отправляются в виде сообщений MIME с заменой кодировки BASE64 на заполнитель. Затем двоичные данные помещаются между разделителями (что происходит для каждого фрагмента двоичных данных), а затем помещаются в конце запроса SOAP. Затем двоичные данные отправляются в незашифрованном виде. IIRC, MTOM также определяет, увеличит ли отправка его в виде сообщения MIME размер вызова SOAP, и, если он не обеспечивает сохранение, он отправит его как обычное сообщение SOAP.

Этот предоставляет пример того, как выглядит сообщение, отправленное по проводной сети.

8 голосов
/ 13 декабря 2016

Есть несколько факторов, которые не упоминаются в других ответах. Кто-то может подумать, почему MTOM не используется по умолчанию, поскольку он «быстрее» , чем кодировка текстовых сообщений (Base64). Это потому, что MTOM не всегда быстрее. MTOM следует использовать только при передаче больших сообщений, потому что это связано с накладными расходами. Для сообщений небольшого размера производительность MTOM будет хуже кодировки текстовых сообщений (Base64).

Если MTOM используется для больших сообщений, он работает быстрее, чем Base64, поскольку он использует необработанный двоичный файл для передачи данных. Чтобы понять это, нужно понять, как работает Base64.

Base64 использует 6 бит (log2 (64)) для представления 1 символа , что означает, что base64 использует 4 символа для представления 24 бит ( 3 байта ). Поэтому, если размер сообщения составляет n байтов , base64 будет использовать 4 * (n / 3) байтов для представления ваших данных, что означает, что они будут на медленнее на 1/3 чем MTOM.

...