単一 ListenUri に対する複数のエンドポイント
このサンプルでは、単一 ListenUri で複数のエンドポイントをホストするサービスを示します。このサンプルは、電卓サービスを実装する「入門サンプル」に基づいています。
メモ : |
---|
このサンプルのセットアップ手順とビルド手順については、このトピックの最後を参照してください。 |
「複数のエンドポイント」サンプルで示すように、サービスでは、異なるアドレスを持ち、場合によってはバインディングも異なる複数のエンドポイントをホストできます。このサンプルは、同じアドレスで複数のエンドポイントをホストできることを示しています。さらに、サービス エンドポイントが持つ、EndpointAddress と ListenUri の 2 種類のアドレスの違いも示します。
EndpointAddress とは、サービスの論理アドレスです。これは、SOAP メッセージの宛先となるアドレスです。ListenUri とはサービスの物理アドレスです。これには、サービス エンドポイントが現在のコンピュータで実際にメッセージをリッスンする、ポートとアドレスの情報が含まれます。ほとんどの場合、これらのアドレスが異なっている必要はありません。ListenUri が明示的に指定されていない場合は、エンドポイントの EndpointAddress の URI が既定値になります。ただし、複数の異なるサービス宛てのメッセージを受け入れることができるルーターを構成する場合など、2 つのアドレスを区別すると便利な場合もあります。
サービス
このサンプルのサービスには、ICalculator
と IEcho
という 2 つのコントラクトがあります。また、一般的な IMetadataExchange
エンドポイントに加え、次のコードに示すように 3 つのアプリケーション エンドポイントがあります。
<endpoint address="urn:Stuff"
binding="wsHttpBinding"
contract="Microsoft.ServiceModel.Samples.ICalculator"
listenUri="https://localhost/servicemodelsamples/service.svc" />
<endpoint address="urn:Stuff"
binding="wsHttpBinding"
contract="Microsoft.ServiceModel.Samples.IEcho"
listenUri="https://localhost/servicemodelsamples/service.svc" />
<endpoint address="urn:OtherEcho"
binding="wsHttpBinding"
contract="Microsoft.ServiceModel.Samples.IEcho"
listenUri="https://localhost/servicemodelsamples/service.svc" />
3 つすべてのエンドポイントは、同じ ListenUri でホストされ、同じ binding
を使用します。ListenUri が同じエンドポイントは、コンピュータの物理アドレスでメッセージをリッスンする 1 つのチャネル スタックを共有するので、同じバインディングを使用する必要があります。各エンドポイントの address
は URN です。通常、アドレスは物理的な場所を表し、実際は任意の種類の URI を設定できますが、サンプルで示すようにこのアドレスは照合とフィルタ処理を行う目的で使用されるので、このように設定されています。
3 つすべてのエンドポイントは同じ ListenUri を共有するので、メッセージがそこに到着すると、Windows Communication Foundation (WCF) ではメッセージの宛先のエンドポイントを決定する必要があります。各エンドポイントにはメッセージ フィルタがあり、これはアドレス フィルタとコントラクト フィルタの 2 つの部分で構成されます。アドレス フィルタは、SOAP メッセージの To とサービス エンドポイントのアドレスを照合します。たとえば、To "Urn:OtherEcho" 宛てのメッセージだけが、このサービスの 3 つ目のエンドポイントの対象となります。コントラクト フィルタは、特定のコントラクトの操作に関連付けられたアクションを照合します。たとえば、IEcho
のアクションが含まれるメッセージを照合します。Echo
は、このサービスの 2 つ目と 3 つ目の、両方のエンドポイントのコントラクト フィルタと照合します。これらのエンドポイントは、どちらも IEcho
コントラクトをホストするからです。
このように、アドレス フィルタとコントラクト フィルタを組み合わせることによって、このサービスの ListenUri に到着する各メッセージを、正しいエンドポイントにルーティングすることができます。3 つ目のエンドポイントは、他の 2 つのエンドポイントと区別されます。このエンドポイントは、他のエンドポイントとは異なるアドレスに送信されるメッセージを受け入れるからです。1 つ目のエンドポイントと 2 つ目のエンドポイントは、コントラクト (受信メッセージのアクション) に基づいて相互に区別されます。
クライアント
サーバー上のエンドポイントに 2 つの異なるアドレスがあるのと同様に、クライアント エンドポイントにも 2 つのアドレスがあります。サーバーとクライアントのどちらでも、論理アドレスは EndpointAddress と呼ばれます。ただし、サーバーの物理アドレスは ListenUri と呼ばれるのに対し、クライアントの物理アドレスは Via と呼ばれます。
これら 2 つのアドレスがサーバー上にある場合、既定では同じアドレスを示します。クライアントで、エンドポイントのアドレスとは異なる Via を指定するには、次のように ClientViaBehavior
を使用します。
Uri via = new Uri("https://localhost/ServiceModelSamples/service.svc");
CalculatorClient calcClient = new CalculatorClient();
calcClient.ChannelFactory.Endpoint.Behaviors.Add(
new ClientViaBehavior(via));
このアドレスは、通常どおりクライアントの構成ファイルで指定します。この構成ファイルは Svcutil.exe によって生成されたものです。Via (サービスの ListenUri に相当) は、サービスのメタデータ内では示されません。したがってこの情報は、(サービスのメタデータ アドレスと同様に) クライアントに帯域外で伝達する必要があります。
このサンプルでは、クライアントはサーバーの 3 つの各アプリケーション エンドポイントにメッセージを送信し、3 つすべてのエンドポイントと通信できる (さらにそれらのエンドポイントを区別できる) ことを示します。これらすべてのエンドポイントが同じ Via を持つ場合でも同様です。
サンプルを設定、ビルド、および実行するには
「Windows Communication Foundation サンプルの 1 回限りのセットアップの手順」が実行済みであることを確認します。
ソリューションの C# 版または Visual Basic .NET 版をビルドするには、「Windows Communication Foundation サンプルのビルド」の手順に従います。
単一コンピュータ構成か複数コンピュータ構成かに応じて、「Windows Communication Foundation サンプルの実行」の手順に従います。
メモ : 複数コンピュータの場合は、Client.cs ファイルで、localhost をサービス コンピュータの名前に置き換える必要があります。
Copyright © 2007 by Microsoft Corporation.All rights reserved.