メッセージ送信最適化メカニズム
SOAP Message Transmission Optimization Mechanism (MTOM) は、World Wide Web Consortium (W3C) により作成された標準です。MTOM は、XML 情報セット (Infoset) を SOAP アプリケーションに表示しながら、選択的にメッセージの一部を再コード化することにより、SOAP メッセージの伝送やワイヤー・フォーマットを最適化するメカニズムを記述します。
- SOAP ペイロードで、base64 インラインを使用してエンコードします。ただし、インラインのエンコードでは SOAP メッセージのサイズが大きくなる傾向があります。 base64 エンコード方式では、バイナリー・データの 2 倍のサイズになることがあるので気をつけてください。
- SOAP with Attachments (SwA) を使用してメッセージをエンコードし、Web Services Interoperability Organization (WS-I) 添付ファイル・プロファイルに従います。 WebSphere® Application Server は現在、このメソッドをサポートしています。
- XML-binary Optimized Packaging (XOP) を使用することによる、バイナリー・メッセージ送信の最適化を提供します。最適化は、バイナリー・データまたはコンテキストについてのみ、使用可能です。 MTOM では XOP を、HTTP を介した SOAP および MIME のコンテキストで使用します。
XOP は、SOAP および MIME パッケージングにのみ適用されるのではなく、すべての XML Infoset とすべてのパッケージング・メカニズムに適用される、バイナリー・コンテンツを持つ XML Infoset のシリアライゼーション・メカニズムを定義します。これは、XML 文書がルート・パーツにあたる、MIME multipart/related パッケージに偶然似ている、XML の代替シリアライゼーションです。このルート・パーツは文書の XML シリアライゼーションにたいへんよく似ていますが、base64 でエンコードされたデータが、base64 でエンコードされていない MIME パーツの 1 つへの参照で置き換えられる点が異なります。この参照によって、エンコードに関連する大量の処理と処理のオーバーヘッドを回避することができます。 エンコードは、バイナリー・データが XML の世界に直接適合できる、唯一の方法です。
MTOM マッピング生成が無効な場合、XOP は使用できません。XOP が使用不可の場合、バイナリー・データは MIME 添付ファイルを使用して送信されません。代わりに、バイナリー・データは通常のように base64 でエンコードされます。
- SOAP メッセージの最適化された伝送またはワイヤー・フォーマットの抽象機能。
この機能は、最適化技術の記述と、送信者、受信者および仲介者における SOAP プロセッサーの振る舞いが汎用的であり、MIME、HTTP などの技術への言及を含まないという点で、抽象的といえます。
最適化技術は、xs:base64Binary データ型の正規字句表現としてアクセスできる SOAP エンベロープ Infoset の一定のコンテンツを選択的にエンコードしながら、
SOAP プロセッサーの SOAP エンベロープ Infoset の考え方の確認を中心として展開します。
これらの抽象機能の実装には 2 つの側面での具体的仕様が必要です。それは、最適化されたワイヤー・フォーマットと、特定のトランスポートでの最適化されたワイヤー・フォーマットの流れ方です。
- MTOM 仕様の 2 つめのパートは、シリアライゼーションの側面を扱っており、標準的には MIME Multipart/Related XOP パッケージングに依存します。 シリアライゼーションの側面とは、MTOM が XOP にかかわる場合です。
- 具体的な SOAP HTTP バインディング・レベルの機能として、MTOM はシリアライゼーション上で展開します。 このパートでは、SOAP MTOM メッセージを保持している XOP パッケージをトランスポートするために HTTP バインディングがどのように使用できるかを記述します。またこのパートでは、XML 1.0 のみの使用など、SOAP MTOM メッセージの XOP パッケージとしての可能なシリアライゼーションについて、一部を制限します。
Java™ API for XML Web Services (JAX-WS) は、MTOM を使用したバイナリー・データ添付ファイル送信のサポートを追加しています。JAX-WS は、JAX-WS 2.0、JAXB 2.0、および SAAJ 1.3 を含む、新たに再体系化された Web サービス用 API スタックの心臓部です。API スタックは統合スタックと呼ばれることもあります。JAX-WS は、Web サービスおよび Web アプリケーションにおける JAX-RPC に取って代わるように設計されています。
添付ファイルの方法
- 値による添付ファイルは、base64 または 16 進 テキスト・エンコード方式を使用して、不透明なデータ・コンテンツがエレメントまたは属性として埋め込まれる場合です。これは、それぞれデータ型 xs:base64Binary および xs:hexBinary として XML スキーマで成文化されます。
- 参照による添付ファイルは、URI を使用して、不透明なデータ・コンテンツがエレメントまたは属性として外部的に参照される場合です。これは、データ型 xs:anyURI として XML スキーマで成文化されます。
これとは別の標準が World Wide Web Consortium (W3C) により定義されており、こちらは SOAP with Attachments (SwA) と呼ばれます。SwA は、添付ファイルを持つ SOAP メッセージをパッケージ化する方法として開発されました。 一部のベンダーでは SwA をサポートしていないため、SwA をより強力な MTOM および XOP メカニズムと置き換えることができます。SwA と MTOM は概念的に似ており、どちらもバイナリー・データを MIME 文書の MIME 添付ファイルとしてエンコードします。 MIME 添付ファイルを使用することにより、大きなバイナリー・ペイロード・トランスポートのパフォーマンスが向上します。
- MTOM は、XOP という標準を使用します。この XOP は SOAP ペイロード内に存在する XOP 参照を定義します。この参照は、バイナリー・データが含まれている MIME 添付ファイルを指します。
- MTOM の場合、XOP 参照は論理的にバイナリー・データを XML 情報セット (Infoset) に組み込みます。SwA の場合、href は、物理的に XML 文書外にあるばかりでなく、論理的にその Infoset に組み込まれていないデータを指します。
- MTOM の場合、バイナリー添付ファイルは、それが SOAP XML 文書の一部であるかのように、論理的に署名できます。
- IBM® のほか、Microsoft .NET でも SwA で見つかるインターオペラビリティーの一部の問題を排除できる MTOM をサポートしています。インターオペラビリティーは、提案された変更を共同提案者が検討した際に、第一目標として扱われました。
SOAP 1.2 および SOAP 1.1
SOAP 1.1 は XML 仕様に基づいています。恐らく SOAP 1.1 実装は今後数年間存在し続けます。まだ SOAP 1.1 を使用しているユーザーのために、添付ファイルのサポート用に MTOM を使用する相互運用可能な方法が用意されています。 SAP、Oracle、Microsoft、および IBM は、SOAP 1.1 ペイロードで MTOM を使用できる方法を定義する、SOAP 1.1 Binding for MTOM 1.0 仕様を W3C に提出しました。この仕様は、SOAP 1.1 で MTOM および XOP 技術をうまく利用するために必要な、SOAP MTOM および XOP 仕様への変更を詳しく定めています。詳しくは仕様を参照してください。
MTOM は SOAP バージョン 1.2 の機能で、Infoset に基づいています。詳しくは、XML 情報セットの資料を参照してください。
MTOM がなければ、データはスキーマで記述されているフォーマットのいずれか (base64 または 16 進) でエンコードされ、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>
<?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>
<xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include"
href="cid:1.urn:uuid:0FE43E4D025F0BF3DC11582467646811@apache.org"/>
</imageData>
</input>
</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--