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

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

Как это работает в целом?

3 ответа

Решение

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

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

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

Все начинается с того, что 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>

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

изображение двоичных данных здесь

Есть несколько факторов, которые другие ответы не упоминают. Можно подумать, почему 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.

Другие вопросы по тегам