SOAP Message Transmission Optimization Mechanism (MTOM) は、World Wide Web Consortium (W3C) が策定した規格です。MTOM は、XML Information Set (Infoset) を SOAP アプリケーションに表示しながら、メッセージの一部を選択的に再エンコードすることによって SOAP メッセージの送信またはワイヤー・フォーマットを最適化するための、メカニズムを記述しています。
MTOM では、SOAP over HTTP および MIME over HTTP のコンテキストで XML-binary Optimized Packaging (XOP) を使用します。XOP は、SOAP および MIME のパッケージ化のみでなくあらゆる XML Infoset およびあらゆるパッケージ化メカニズムにも適用可能なバイナリー・コンテンツを含む、XML Infoset のシリアライゼーション・メカニズムを定義します。これは、XML の代替シリアライゼーションであり、偶然ですが、XML 文書をルート部として含む MIME マルチパートまたは関連パッケージによく似ています。このルート部は、文書の XML シリアライゼーションに非常によく似ていますが、Base64 エンコード・データが、MIME パートの 1 つ (これは Base64 エンコードされていません) への参照によって置き換えられる点が異なります。そのような参照を使用することで、エンコードに伴う処理のボリュームを減らしてオーバーヘッドを回避することができます。エンコードはバイナリー・データを XML と直接に連携させる唯一の手段です。
MTOM マッピング生成が使用不可になっている場合、XOP は使用できません。XOP が使用できないと、バイナリー・データは MIME 添付ファイルを使用して送信されません。その代わりに、バイナリー・データは、通常通り、Base64 エンコードされます。
MTOM が使用できない場合、データは、スキーマ (Base64 または hex) に記述されている何らかのフォーマットでエンコードされてから、XML 文書に表示されます。以下に、<xsd:base64Binary> 要素を含む SOAP メッセージの例を示します。
... other transport headers ...
Content-Type: text/xml; charset=UTF-8
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<sendImage xmlns="http://org/apache/axis2/jaxws/sample/mtom">
<input>
<imageData>R0lGODl ... more base64 encoded data ... KTJk8giAAA7</imageData>
</input>
</sendImage>
</soapenv:Body>
</soapenv:Envelope>
MTOM が使用可能な場合、添付ファイルを表すバイナリー・データが SOAP メッセージの MIME 添付ファイルとして含まれます。以下に、添付データ付きの MTOM 対応 SOAP メッセージの例を示します。
... other transport headers ...
Content-Type: multipart/related; boundary=MIMEBoundaryurn_uuid_0FE43E4D025F0BF3DC11582467646812;
type="application/xop+xml"; start="<0.urn:uuid:0FE43E4D025F0BF3DC11582467646813@apache.org>";
start-info="text/xml"; charset=UTF-8
--MIMEBoundaryurn_uuid_0FE43E4D025F0BF3DC11582467646812
content-type: application/xop+xml; charset=UTF-8; type="text/xml";
content-transfer-encoding: binary
content-id:
<0.urn:uuid:0FE43E4D025F0BF3DC11582467646813@apache.org>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<ati:sendImage xmlns="http://org/apache/axis2/jaxws/sample/mtom" xmlns:ati="http://org/apache/axis2/jaxws/sample/mtom">
<ati:input>
<ati:imageData>
<xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:1.urn:uuid:0FE43E4D025F0BF3DC11582467646811@apache.org"/>
</ati:imageData>
</ati:input>
</ati:sendImage>
</soapenv:Body>
</soapenv:Envelope>
--MIMEBoundaryurn_uuid_0FE43E4D025F0BF3DC11582467646812
content-type: text/plain
content-transfer-encoding: binary
content-id:
<1.urn:uuid:0FE43E4D025F0BF3DC11582467646811@apache.org>
... binary data goes here ...
--MIMEBoundaryurn_uuid_0FE43E4D025F0BF3DC11582467646812--
詳しくは、正式な MTOM 仕様 (SOAP Message Transmission Optimization Mechanism) を参照してください。