特集

次世代XML Webサービスを試す Part 3

− SOAPメッセージのルーティング(前編) −

1.SOAPメッセージのルーティングを規定するWS-Routing

インフォテリア株式会社
吉松 史彰
2003/02/20

Page1 Page2 Page3 Page4 Page5 Page6


Back Issue
1
Web Services Enhancements イントロダクション −
2
WS-Security詳細解説

SOAPメッセージのルーティング

 インターネットの世界がIPパケットのルーティングで成り立っていることは読者も知っているとおりだ。読者はこの記事を読むために、@ITが管理しているWebサーバに「直接」接続する必要はない(実際に@ITのデータセンターに物理的に入らない限り無理だ)。そのWebサーバの論理的な識別子であるURLを使えば、あとはまるで魔法のように「インターネット」という怪物がWebサーバまで連れて行ってくれ、ホームページを読ませてくれることになっている。この魔法の正体がDNSとIPパケットのルーティングによって出来上がっていることは今さらいうまでもないだろう。

 XML Webサービスが「HTTP+XMLによるオブジェクトへのアクセス」だったころは、クライアントはサーバに直接接続して「オブジェクトにアクセスするためのXML」を送り込み、結果のXMLを受け取っている図が描かれていた(直接とはこの場合、HTTPというアプリケーション・プロトコル・レベルの話で、もちろんIPレベルで直接というわけではない。WebのクライアントがWebのサーバを直接指定しているということだ)。

 しかし現実のシステムにおいては、極めて限定的な場面にしかこのような実装は応用できない。現在主流の「アプリケーション・サーバ」では、BeanやCOMクラスを「Webサービス」として公開できる機能を売り文句にしているものも多いが、そのような機能は実際にはほとんど利用されないだろう。これまでのメソッド呼び出しのような頻度でデータをXML化したりHTTPで送受信したりすることなど非現実的だからだ。加減乗除をいちいちHTTP+XMLで行うなんてパフォーマンスを損なうのは目に見えている。

 現在W3Cで仕様化が進められているSOAP 1.2においては、SOAPはSimple Object Access Protocolの略ではない。これは、HTTPの先にあるオブジェクトへアクセスしてメソッドを呼び出すためのプロトコルという考え方から決別しようとしていることを意味する。SOAPは、何らかの手段で指定されたあて先に配送するために作られた、XML InfoSetで表現された「メッセージ」の仕様を決めているプロトコルである(SOAPは配送方法を規定しないことに注意してほしい)。

 この考え方は、ちょうどIPというプロトコルと同じだ。IPパケットはデータとIPヘッダに大別できる。同様に、SOAPメッセージもデータとSOAPヘッダに大別できる。IPパケットはイーサネットやトークンリングなどのさまざまなネットワークに乗せて配信できるメッセージ形式だ。SOAPメッセージは、HTTPやSMTPなどのさまざまな転送プロトコルに載せて配信できるメッセージ形式だ。

 SOAP仕様によると、SOAPメッセージは送信者(Sender)から発信され、途中幾つかの中継者(Intermediary)を通って、最終的な受信者(Ultimate Receiver)に到達する、一方向に流れるメッセージだ。勘のいい読者は気付いただろう。これもIPパケットと同じだ。IPパケットは、送信者から幾つかの中継者(ルータ)を通って、最終的な受信者に到達する一方向のメッセージだ。

 SOAPメッセージには、Body要素とHeader要素が含まれる。Body要素の内容はメッセージの最終的な受信者に対して送られる「本文」であり、Header要素の内容はさまざまな受信者が処理するための付加的な情報である。Body要素にはその対象(あて先)を指定することはできない(暗黙に最終的な受信者が想定される)が、Header要素の内容にはsoap:actor属性を使ってその要素を処理すべきあて先を指定することができる。さらにHeader要素の内容には、処理が必須であることを示すフラグを設定できる(soap:mustUnderstand属性)。

 これらから分かるとおり、SOAPメッセージは単純に送信者から受信者へ直接配信されるわけではなく、送信者から幾つかの中継者を経て最終的な受信者に到達することが想定されているのだ。しかし、SOAP仕様にはSOAPメッセージの流れは書いてあるものの、それをどうやって流すかは規定されていない。送信者は中継者の情報をどうやって得るのか? 中継者は受け取ったSOAPメッセージをどうやって最終的な受信者に渡すのか? それらはSOAP仕様では何1つ規定されていない。その方法を規定した1つの仕様が「WS-Routing」だ。

WS-Routing

 WS-Routing仕様の日本語訳はマイクロソフトのホームページで参照できる(WS-Routing 仕様 インデックス)。WS-Routingは、2003年1月現在、まだどの標準化団体にも提出されていない、Microsoftが提唱している独自仕様だ。とはいえ、世の中にはすでにさまざまな実装が存在する*1。本連載で取り上げているMicrosoftのWebサービス開発キット「Web Services Enhancements(以下WSE)」には、Microsoftが提供する実装が含まれている。

*1 http://www.whitemesa.com/wmsoapsvc_about.htmhttp://soap.4s4c.com/ など

 WS-Routingには、大きく2つの機能がある。1つは、メッセージが配信される経路を定義する機能だ。経路は行きと帰りの2つを別々に指定することができる。もう1つは、2つ以上のメッセージを関連付ける機能だ。これら2つの機能によって、WS-RoutingはXML Webサービスの実現に欠かすことのできない「非同期処理」機能をもたらす。

 従来のWebサービスでは、HTTPのリクエストとレスポンスの対がそのままXML Webサービスの2つのメッセージに対応付けられていたため、リクエストを受け取ったあとにしばらく時間のかかる処理を行い、後日処理結果を返答するようなサービスを作るには独自の実装が必要だった。WS-Routingは、このようなXML Webサービスを構築する標準的な方法を提供することを目的にしている。なお、WS-RoutingにはReliable Messagingの機能は含まれていないことに注意してほしい。メッセージの到達保証、順序保証、重複排除などの機能はWS-Routing仕様では実現できない。

 WS-Routing仕様では、SOAPのHeader要素の内容となる要素を1つ定義している。この要素はpathという名前で、http://schemas.xmlsoap.org/rpという名前空間に属している。path要素には8つの子要素が定義されている(下表)。これらの要素もすべてhttp://schemas.xmlsoap.org/rpという名前空間に属している。

要素名 内容 必須
action SOAPメッセージの意図を識別できるURI
to SOAPメッセージの最終的な受信者を示すURI ×
fwd SOAPメッセージが送信者から最終的な受信者に到達する前に通る経路上の中継者のURI ×
rev SOAPメッセージが最終的な受信者から送信者に送り返されるときに通る経路上の中継者のURI ×
from SOAPメッセージの送信者を示すURI ×
id SOAPメッセージを識別できるID
relatesTo SOAPメッセージが関連しているほかのSOAPメッセージのID ×
fault ルーティングに際してのエラー情報 ×
表 WS-Routing仕様で定義されているpath要素の子要素

 WS-Routingのヘッダが付けられたSOAPメッセージは次のようなものになる。

<soap:Envelope
      xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <wsrp:path xmlns:wsrp="http://schemas.xmlsoap.org/rp/">
      <wsrp:action>
        http://example.com/GetLastTradePrice
      </wsrp:action>
      <wsrp:to>http://example.com/stockquote</wsrp:to>
      <wsrp:rev />
      <wsrp:id>uuid:d0288e74-981d-47ff-ae4d-49cc4cf2cc7d</wsrp:id>
    </wsrp:path>
  </soap:Header>
  <soap:Body>
    <ns1:GetLastTradePrice xmlns:ns1="http://example.org/gltp">
      <item>QQQ</item>
    <ns1:GetLastTradePrice>
  <soap:Body>
<soap:Envelope>
XML Webサービスに付加されるWS-Routing情報の例(行き)
 
<soap:Envelope
      xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <wsrp:path xmlns:wsrp="http://schemas.xmlsoap.org/rp/">
      <wsrp:action>
        http://example.com/GetLastTradePrice
      </wsrp:action>
      <wsrp:rev>
        <wsrp:via />
      </wsrp:rev>
      <wsrp:id>uuid:462e2618-b7e1-407b-911e-32065df971cd</wsrp:id>
      <wsrp:relatesTo>
        uuid:d0288e74-981d-47ff-ae4d-49cc4cf2cc7d
      </wsrp:relatesTo>
    </wsrp:path>
  </soap:Header>
  <soap:Body>
    <ns1:GetLastTradePriceResponse>
      <result>12.34</result>
    <ns1:GetLastTradePriceResponse>
  <soap:Body>
<soap:Envelope>
XML Webサービスに付加されるWS-Routing情報の例(帰り)
 

 INDEX
  [特集]次世代XML Webサービスを試す Part 3
  SOAPメッセージのルーティング
  1.SOAPメッセージのルーティングを規定するWS-Routing
    2.WSEでのWS-Routing利用
    3.WS-RoutingのSOAPメッセージ
    4.WSEによるルータの実装
    5.WS-Referralを利用したルーティング(1)
    6.WS-Referralを利用したルーティング(2)

 「特集:次世代XML Webサービスを試す」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間