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

2.WSEでのWS-Routing利用

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

Page1 Page2 Page3 Page4 Page5 Page6

WSEとWS-Routing

 WSEでWS-Routingを実装するということは、すなわちWS-Routing仕様をサポートする「ルータ」を実装することにほかならない。このルータは、渡されたSOAPメッセージをさまざまな条件に応じてほかの中継者、あるいは最終的な受信者に転送する。

 例えば、受け取ったメッセージをすべてログに記録し、次の中継者へ転送するルータが考えられる。ファイアウォールのように、特定のあて先が指定されたSOAPメッセージだけを内部ネットワークに転送し、残りは拒否するようなルータもあり得る。あるいは論理的なあて先URIに対して負荷を考慮しながら実際の転送先を振り分けるロード・バランサのようなルータも考えられるだろう。WSEには「NO-OPルータ」、つまり何もせずに次の転送先へメッセージを転送するルータが付属している。

■WSEのルータを利用するXML Webサービス作成

 WSEで提供されているルータを利用するには、次の手順でASP.NETのXML Webサービスを作成すればよい。からまでの手順は、本連載Part1でWS-Securityの実装を行ったときと同じで、WSEの機能が使えるようにするための準備だ。

Visual Studio .NET(以下VS.NET)で「ASP.NET Webサービスプロジェクト」を新しく作成する。ここでは名前を「WSERouting」とした。

VS.NETの「参照の追加」機能でMicrosoft.Web.Services.dllへ参照を追加する。

プロジェクト内のWeb.configファイルを編集して、system.web要素の子要素になるように次の要素を記述して、XML Webサービスの実行時にSoapExtensionが起動されるようにする。

<webServices>
  <soapExtensionTypes>
    <add type="Microsoft.Web.Services.WebServicesExtension, Microsoft.Web.Services, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" priority="1" group="0"/>
  </soapExtensionTypes>
</webServices>
Web.configファイルでのSoapExtensionの設定
XML Webサービスの実行時にSoapExtensionが起動されるようにする。

同じくWeb.configファイルを編集して、system.web要素の子要素になるように次の要素を記述して、「.ashx」という拡張子を持つURLへの要求に対して、Microsoft.Web.Services.Routing.RoutingHandlerクラスで対応するようにHTTPハンドラをHTTPパイプラインに挿入する。

<httpHandlers>
  <add type="Microsoft.Web.Services.Routing.RoutingHandler, Microsoft.Web.Services, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" path="*.ashx" verb="*" />
</httpHandlers>
Web.configファイルでのHTTPハンドラの設定
「.ashx」という拡張子を持つURLへの要求に対して、RoutingHandlerクラスが対応できるようにする。

Service1.asmx.csファイルに次のようなWebMethodを記述する。

[WebMethod]
public string Echo(string input) {
  return input;
}
Webサービスとなるメソッドの追加

■XML Webサービスのクライアント作成

 これでサーバ側の実装ができたので、今度はクライアント側を実装してみよう。ここでもからまでの手順はPart1のときと同じだ。

コンソール・アプリケーションのプロジェクトを作成する。ここでは名前を「WSERoutingClient」とした。

プロジェクトにMicrosoft.Web.Services.dllへの参照を追加する。

上記手順で作成したWebサービスに対してWeb参照の追加を行う。

http://localhost/WSERouting/Service1.asmx?wsdl

というURLでWebサービスのWSDLが取得できるはずだ。

作成されたプロキシ・クラスのソース・コードを変更する。プロキシ・クラスのソース・コードは、Reference.csという名前で[Web References]の中の[localhost]の下にある。表示されない場合は、VS.NETのソリューション・エクスプローラで[すべてのファイルを表示]ボタンをクリックする。

 変更内容は、プロキシ・クラス「WSERoutingClient.localhost.Service1」の基底クラスを、

System.Web.Services.Protocols.SoapHttpClientProtocol

から、

Microsoft.Web.Services.WebServicesClientProtocol

にすることだけだ。

public class Service1 :
Microsoft.Web.Services.WebServicesClientProtocol {
  ……
自動生成されたプロキシ・クラスの基底クラスの修正

Mainメソッドを実装する。

 このメソッドの中でルーティングの経路を設定する。具体的には、上記の手順で基底クラスを変更することによって得られるSoapContextクラスを取得し、そのPathプロパティに経路を設定していく。ここでは、次のような経路を設定する。

送信者(コンソール・アプリケーション)
 → http://localhost/WSERouting/a.ashx(中継者)
  → http://localhost/WSERouting/b.ashx(中継者)
   → http://localhost/WSERouting/c.ashx(中継者)
    → http://localhost/WSERouting/Service1.asmx(最終的な受信者)

static void Main(string[] args) {
  localhost.Service1 svc = new localhost.Service1();
  Microsoft.Web.Services.SoapContext ctx = svc.RequestSoapContext;
  ctx.Path.Rev = new Microsoft.Web.Services.Routing.ViaCollection();
  ctx.Path.Fwd.Add(new Microsoft.Web.Services.Routing.Via(
              new Uri("http://localhost/WSERouting/a.ashx")));
  ctx.Path.Fwd.Add(new Microsoft.Web.Services.Routing.Via(
              new Uri("http://localhost/WSERouting/b.ashx")));
  ctx.Path.Fwd.Add(new Microsoft.Web.Services.Routing.Via(
              new Uri("http://localhost/WSERouting/c.ashx")));
  Console.WriteLine(svc.Echo("hello"));
}
Mainメソッドでの経路の設定
SoapContextオブジェクトのPathプロパティで、経由する中継者を追加する。ViaCollectionはrev要素を追加するためのもの。

 なお、a.ashx、b.ashx、c.ashxの3つについては、ファイルとして存在している必要はない。サーバ側の作成手順のところで設定したとおり、.ashxという拡張子に対するアクセスは、RoutingHandlerクラスを代わりに立ち上げて処理するように構成してあるため、これらに対するURLへのアクセスはすべてRoutingHandlerに渡されるからだ。


 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 記事ランキング

本日 月間