次の方法で共有


中間ルーター

Download sample

このサンプルでは、クライアントから直接サービスにアクセスできないネットワーク構成に役立つ、基本的なルーティング機能を提供するサービスを実装する方法を示します。このサンプルは、効率的で拡張可能な、多数の機能が付属するルーターの例を示すものではありません。

Noteメモ :

このサンプルのセットアップ手順とビルド手順については、このトピックの最後を参照してください。

SOAP 中継局が含まれる一般的な通信のシナリオでは、クライアントから送信されるメッセージは 1 つ以上の追加サービスを経由して最終的な送信先に到達します。この追加サービスとは、実際にメッセージを処理して、応答が求められた場合にはその応答を提供するサービスです。SOAP 中継局は、通過するメッセージに関するさまざまなアクションを実行できます。たとえば、キャッシュ中継局はキャッシュされた応答をメッセージに返します。これにより、要求を再度処理する必要のあるサービスの負荷が軽減されます。負荷分散中継局は、ラウンド ロビン方式のアルゴリズムを使用して、処理能力のある多数のサービスの 1 つにメッセージを転送します。スキーマ検証中継局は、コントラクトの XSD および他のプロトコルなどに完全準拠するメッセージだけを転送します。このサンプルのために開発された中継局は、メッセージのヘッダーと内容に基づいて、そのメッセージを適切なサービスにルーティングします。

このサンプルでは、クライアント要求を処理するために、電卓サービスとエコー サービスという 2 つのアプリケーション サービスが開発されました。これらのサービスのアプリケーション エンドポイントにアクセスできるのは、内部ネットワークからだけです。サービスの Metadata Exchange (MEX) エンドポイントには、パブリックにアクセスできます。SOAP ルーターは内部ネットワークの一部であり、内部ネットワークの外側から送信されるすべてのアプリケーション要求は、このルーターを通過する必要があります。

クライアントは、Service Model Metadata Utility Tool (Svcutil.exe) を両方のサービスに対して実行することによって作成されました。Svcutil.exe を最初のサービスに対して実行したときに構成ファイルが作成され、Svcutil.exe で 2 つ目のサービスの構成情報をその構成ファイルにマージすることにより、2 つのコード ファイル (各サービスに 1 つのクライアント) と 1 つの構成ファイルが生成されました。各サービスで提供される Web サービス記述言語 (WSDL) には、実際のサービスのアドレスではなく SOAP 中継局のアドレスが含まれます。これにより、クライアントで構成ファイルを変更する必要はなく、SOAP 中継局のアドレスの内容を知る必要もありません。

さらにこのサンプルでは、ルーター サービスは 2 つのエンドポイントで構成されています。1 つ目のエンドポイントは SOAP 1.2 に対して HTTP を使用し、テキスト エンコードのメッセージをリッスンします。もう 1 つのエンドポイントは SOAP 1.2 に対して TCP を使用し、バイナリ エンコードのメッセージをリッスンします。各アプリケーション サービスの WSDL は、ルーター上で正しいエンドポイント アドレスを使用します。またこのルーターには、構成ファイルの appSettings セクションのルーティング情報も提供されます。この構成ファイルには次のプロパティが含まれています。

  • prefixes および namespaces - WCF の既定の XmlNamespaceManager を更新する際に使用します。これにより、ルーターの XPath にあるプレフィックスの解決方法がわかります。

  • xpath および epr - ルーティングのエントリを、XPathsEPRs にマップするルーティング テーブルに追加するときに使用します。

ルーターは XpathMessageFilterTable (XPathFilterTable<T>) クラスを使用します。ここで、"T" はユーザーから提供されるルーティングのエントリを格納する EndpointAddress を示します。メッセージが受信されると、ルーターは、Message インスタンスを渡す MatchMultiple メソッドを呼び出して、メッセージの転送先となる EndpointAddress を取得します。

EchoServiceCalculatorService は両方とも ListenUri プロパティを使用して、エンドポイントがリッスンしている URI を設定します。エンドポイント宣言内で提供されるアドレスは、サービスのメッセージを転送できるルーターのエンドポイント アドレスです。このアドレスはサービスの WSDL に表示され、各受信メッセージの WS-Addressing To header と一致します。ただし、ListenUri プロパティによって提供されるアドレスは、トランスポートのみによって使用される、エンドポイントが実際にリッスンする物理アドレスです。

WCF には、SOAP 中継局シナリオで一般的に使用される別の動作である ClientViaBehavior チャネル動作が用意されていますが、このサンプルでは実行しません。ClientViaBehavior は、クライアントがトランスポート チャネルを作成する URI を指定するために使用されます。該当する動作がクライアント エンドポイントの動作コレクションにある場合、トランスポートは、それによって提供される URI を使用します。一方、スタック内のその他のすべてのチャネル レイヤは、ChannelFactory の構築時に提供された EndpointAddress を使用します。この EndpointAddress は、WS-Addressing To header にもなります。この動作を使用するサンプル コードを次に示します。

ChannelFactory<IContract> factory = new ChannelFactory<IContract>(new EndpointAddress("http://hostname/service"));
factory.Endpoint.Behaviors.Add(new ViaUriBehavior(new Uri("http://hostname/intermediary")));
IContract channel = factory.CreateChannel(); 

SOAP 中継局と共に使用される WCF のもう 1 つの機能は、AddressFilter プロパティです。AddressFilter は WCF で使用され、特定のフィルタに一致するメッセージだけを受信します。サービス コントラクトのメソッドで、Action に "*" が使用されている場合、アドレスだけがチェックされます。このサンプルではアドレスは常に正しいので、この機能は使用されません。ルーターは、To headers がルーターのエンドポイント アドレスに一致することにより、クライアントのメッセージを受信します。また、メッセージが転送されたサービスは、To header がエンドポイントの論理アドレスと一致することにより、そのメッセージを受信します。

サンプルの Contracts.cs ファイルには、トランスポートのそれぞれのパターンに応じて次の 4 つのインターフェイスが定義されています。

  • ISimplexDatagramRouter - このインターフェイスは、一方向データグラム チャネルでメッセージを受信する場合に必要です。一方向の HTTP チャネル、または一方向の TCP チャネルおよび NamedPipe チャネルでのメッセージ受信を想定する場合は、このインターフェイスを使用してエンドポイントを追加します。

  • IRequestReplyDatagramRouter - このインターフェイスは、要求/応答のデータグラム チャネルでメッセージを受信する場合に必要です。双方向の HTTP チャネルでのメッセージ受信に使用します。

  • ISimplexSessionRouter - このインターフェイスは、一方向セッションフル チャネルでのメッセージを受け入れる必要があります。一方向 TCP チャネルおよび一方向 NamedPipe チャネルに対して使用します。

  • IDuplexSessionRouter - このインターフェイスは、双方向セッション チャネル用のインターフェイスです。双方向 TCP チャネルおよび双方向 NamedPipe チャネルに対して使用します。

RouterBinding は、WCF バインディングを作成して SOAP 中継局をサポートするための例が提供されています。これにより、このシナリオで必要な最も一般的な設定を指定でき、実際に必要なバインディング要素だけが追加されます。また、基本的な構成サポートも示されます。

このサンプルは HTTP 以外のトランスポートに依存しているため、Web ホストを使用しません。TCP アクティベーションは、現在 Windows Vista と IIS 7.0 だけで使用できます。

このサンプルを実行する場合は、操作要求および応答はクライアントのコンソール ウィンドウに表示されます。クライアントをシャットダウンするには、クライアント ウィンドウで Enter キーを押します。

Echo("Is anyone there?") returned: Is anyone there?
Add(5) returned: 5
Add(-3) returned: 2

サンプルを設定、ビルド、および実行するには

  1. ソリューションの C# 版、C++ 版、または Visual Basic .NET 版をビルドするには、「Windows Communication Foundation サンプルのビルド」の手順に従います。

  2. 単一コンピュータ構成か複数コンピュータ構成かに応じて、「Windows Communication Foundation サンプルの実行」の手順に従います。ただし、次の例外があります。

    1. 単一コンピュータ構成と複数コンピュータ構成の両方で、クライアント用、SOAP ルーター用、および各アプリケーション サービス用の、合わせて 4 つのプロジェクトと 4 つの実行可能ファイルが必要です。

    2. 複数コンピュータ構成では、4 つの構成ファイルに対して次の変更を行う必要があります。

      CalculatorServiceEchoService の App.config ファイルの 21 行目を変更する必要があります。中継局のホスト名を、localhost から実際のホスト名に置き換えます。

      ルーターの App.config ファイルの 15 行目を変更する必要があります。("|" で区切られている) 2 つのアドレスを、それぞれ EchoServiceCalculatorService のホスト名に変更します。

      クライアントの App.config ファイルの 5 行目と 7 行目を変更する必要があります。中継局のホスト名を、localhost から実際のホスト名に置き換えます。

      また、2 つのアプリケーション サービスが正しいアドレスを使用するように更新された後は、サービスに対してService Model Metadata Utility Tool (Svcutil.exe) を使用して、App.config ファイルを再生成することもできます。

  3. RouterEchoService、および CalculatorService をすべて実行した後で、クライアントを開始してください。3 つのサービスでは、開始時にリッスンするエンドポイント アドレスがそれぞれ出力されます。

    Noteメモ :

    EchoService と CalculatorServic のアプリケーション エンドポイントでは、ルーターのアドレスが使用されます。

  4. クライアントを実行します。クライアントは、最初に EchoService に接続し、次に CalculatorService に接続します。Router は、送信側と受信側の両方で、転送されるメッセージの WS-Addressing 操作を出力します。

    Noteメモ :

    Client.exe と Router.exe が異なるコンピュータ上にある場合は、Client.exe.config の <identity/> セクションのコメントを解除し、実行する Router.exe の同じセクションにユーザー プリンシパル名を設定します。

Footer image

Copyright © 2007 by Microsoft Corporation.All rights reserved.