MTOM est le mécanisme d'optimisation de la transmission des messages du W3C, une méthode d'envoi efficace de données binaires vers et depuis les services Web.
Comment ça marche en général?
Si vous placez Wireshark (ou activé System.Net Logging ) sur le service non compatible MTOM, vous devriez voir les SOAP requêtes avec les données binaires encodées en BASE64. L'envoi en BASE64 augmente la taille des données binaires mais (je suppose) les rend plus interopérables.
Avec MTOM, les messages SOAP sont envoyés en tant que messages MIME avec le codage BASE64 remplacé par un espace réservé. Les données binaires sont ensuite placées entre des délimiteurs (ce qui se produit pour chaque élément de données binaires), et puis placé à la fin de la demande SOAP. Les données binaires sont ensuite envoyées non codées. IIRC, MTOM détermine également si l'envoi en tant que message MIME augmentera la taille de la SOAP et s'il ne fournit pas d'économie, il l'enverra comme un message normal SOAP.
This fournit un exemple de ce à quoi ressemble le message envoyé sur le fil.
Tout commence par le fait que SOAP est XML . Et lorsque vous envoyez autre chose que du texte, par exemple, un image - il doit être converti en un type de données qu'un processeur XML peut comprendre.
Sans MTOM, votre image sera convertie en base64Binary et placée au milieu de votre enveloppe SOAP. Ce processus de conversion rend les données volumineuses.
<tns: data> Une chaîne binaire très looooooooooooooooooooooooong base64 </ tns: data>
Voici une illustration simple:
Avec MTOM, l'image sera transmise extérieur l'enveloppe sous forme de pièce jointe MIME - bref, elle est envoyée selon son type de données d'origine: un jpg, png ou gif. Bien sûr, elles sont toujours transmises sous forme de données binaires, mais cette fois, il n'y a pas de conversion liée à XML, ce qui évite la surcharge de calcul. XOP apparaît dans l'image car c'est celle qui donne l'emplacement de l'image externalisée.
<soap:Envelope>
<soap:Body>
<tns:data>
<xop:include href="SomeUniqueID-ThatLeadsToTheImage"/>
</tns:data>
</soap:Body>
</soap:Envelope>
Content-id: "SomeUniqueID"
Type de contenu: image/pngdonnées binaires d'image ici
Il y a quelques facteurs que d'autres réponses ne mentionnent pas. On pourrait penser pourquoi MTOM n'est pas utilisé par défaut car il est "plus rapide" que l'encodage des messages texte (Base64). C'est parce que MTOM n'est pas toujours plus rapide. MTOM ne doit être utilisé que sur les transferts de messages volumineux car il est livré avec une surcharge. Pour la petite taille des messages, les performances de MTOM seront pires que le codage des messages texte (Base64).
Si MTOM est utilisé pour les gros messages, il est plus rapide que Base64 car il utilise un binaire brut pour le transfert de données. Pour comprendre cela, il faut comprendre comment fonctionne Base64.
Base64 utilise 6 bits (log2 (64)) pour représenter 1 caractère ce qui signifie que base64 utilise 4 caractères pour représenter 24 bits (octets). Donc, si la taille du message est n octets, base64 utilisera 4 * (n/3) octets pour représenter vos données, ce qui signifie qu'il sera plus lent de 1/ que MTOM.