アタッチメント

この業界で標準仕様を外部から追いかけていると、同じような標準が次々と出現して頭を悩ませることが多い。特に Web サービス関連の仕様はその傾向が強い。同じような二つ(以上の)仕様があったときに、その間の関連性を仕様書から読み取ることは、通常はとても難しい。
SOAP メッセージのアタッチメントもそんな仕様のひとつだ。SOAP メッセージに、XML 以外のコンテンツを入れるときには、主に以下の二つのやり方がある。

XML Schema datatype の base64Binary を使う
この方法ではコンテンツを Base64 エンコードして XML 文書中に直接埋め込む。全体がひとつの XML 文書であるところはとてもわかりやすいが、コンテンツのサイズがちょっとでも大きくなるととたんにパフォーマンスが低下する。
アタッチメントを使う
この方法ではコンテンツを SOAP メッセージ部とは別の格納方法で転送する。SOAP メッセージには参照だけが埋め込まれ、XML のサイズや Base64 エンコードなどパフォーマンスの問題は発生しない。

アタッチメントを実現する手法として SOAP Message with Attachments(SwA) が2000年に提案された。これは MIME マルチパートを利用したアタッチメントの表現手法で、SOAP メッセージをひとつのサブパート、アタッチメントを SOAP メッセージとは異なるサブパートとして記述する。後述の Omri 氏によればこの仕様には二つの問題があったとされている。一つは MIME のパースのパフォーマンスの問題であり、もう一つはアタッチメントが XML Infoset として表現できない点である。
その後2002年、まったく異なるアタッチメントの仕様が提案された。 DIME (direct internet message encapsulation)である。DIME ではアタッチメントと SOAP メッセージはバイナリ形式で格納される。コンテントのサイズが入るフィールドが定義され、プログラムはそれを使ってパースを行うため MIME マルチパートよりも性能がよい。
ここからマイクロソフトDIME をサポートし、Java 陣営は SwA をサポートするため両者の間での非互換が発生した。その後 Axis は DIME をサポートしたが、Java では SAAJ という API が定義され SwA が主流になり、WS-I ではアタッチメントの標準として SwA が採用された。SOAP メッセージのアタッチメントについては混乱が続いたわけである。
ここまでの事情は僕もだいたい追いかけられていた。しかし、この問題は混沌のままであると認識していた。ところがMartin Gudgin 氏のポスト "DIME is dead"というタイトルを見て仰天した。いったい DIME はどうなったのか。そして相互運用性のあるアタッチメント仕様は策定されるのか。その答えの一部は Omri Gazitt 氏のこのポストにある。
2003年の4月、Proposed Infoset Addendum to SOAP Messages with Attachments ("PASwA") が提案された。これは MIME ベースで Infoset の問題を解決しようとしている提案である。そして、これを受けて昨年(2003年)夏、SOAP Message Transmission Optimization Mechanism ("MTOM")W3CXML プロトコル WG から出版された。
Omri 氏によれば、SwA のパフォーマンス問題はそれほど重要ではないと認識されるにいたったようだ。それよりも Infoset 問題を解決するために新しい仕様が必要であったということのようである。そして、WS-I で相互運用性を保持したアタッチメントのためのプロファイルを策定することを提言している。WS-I では現在 Basic Pforile 1.0 にアタッチメントを追加したプロファイルを策定中であるが、これに現時点で MTOM を入れるのは少し難しいのではないかと思う。MTOMはまだ W3C の Working Draft でしかないからだ。ただし、世の中の流れとして最終的には MTOM が使われるようになる可能性が高いことは確かだろう。
ちなみに Omri 氏はその後のポストにおいて現時点では DIME を使うのがよいという見解を発表している。確かに DIME は現時点でも .NET, Axis, gSOAP などで実装されているからだ。