Share via


探索クライアント チャネルの使用

WCF クライアント アプリケーションを記述するときには、呼び出すサービスのエンドポイント アドレスを知っている必要があります。 多くの場合、サービスのエンドポイント アドレスがわからなかったり、サービスのアドレスが時間の経過と共に変化したりします。 探索クライアント チャネルでは、WCF クライアント アプリケーションを記述し、呼び出すサービスを示すと、クライアント チャネルが自動的にプローブ要求を送信します。 サービスが応答すると、探索クライアント チャネルは、プローブ応答からサービスのエンドポイント アドレスを受け取り、それを使用してサービスを呼び出します。

探索クライアント チャネルの使用

探索クライアント チャネルを使用するには、DiscoveryClientBindingElement のインスタンスをクライアント チャネル スタックに追加します。 または、DynamicEndpoint を使用すると、まだ追加されていない場合は、DiscoveryClientBindingElement が自動的にバインディングに追加されます。

注意事項

DiscoveryClientBindingElement は、クライアント チャネル スタックの最上位要素にすることをお勧めします。 DiscoveryClientBindingElement の上に追加されたバインディング要素では、ChannelFactory、またはそれによって作成されるチャネルが、エンドポイント アドレスまたは Via アドレス (CreateChannel メソッドに渡されたアドレス) を使用しないようにする必要があります。これらには、正しいアドレスが格納されていない可能性があります。

DiscoveryClientBindingElement クラスには、2 つのパブリック プロパティが含まれています。

  1. 呼び出すサービスを示すのに使用する FindCriteria

  2. 探索メッセージの送信先の探索エンドポイントを指定する DiscoveryEndpointProvider

FindCriteria プロパティでは、探しているサービス コントラクト、必要なスコープ URI、およびチャネルを開く最大試行回数を指定できます。 コントラクトの型は、コンストラクター FindCriteria の呼び出しによって指定されます。 スコープ URI は Scopes プロパティに追加できます。 MaxResults プロパティでは、クライアントが接続を試行する結果の最大数を指定できます。 プローブ応答を受信すると、クライアントは、プローブ応答で取得したエンドポイント アドレスを使用してチャネルを開きます。 例外が発生した場合、クライアントは次のプローブ応答に進み、必要に応じて、さらに応答の受信を待機します。 チャネルが正常に開かれるか、または結果の最大数に達するまで、この処理が続行されます。 これらの設定の詳細については、「FindCriteria」を参照してください。

DiscoveryEndpointProvider プロパティでは、使用する探索エンドポイントを指定できます。 通常は UdpDiscoveryEndpoint ですが、任意の有効なエンドポイントを指定できます。

サービスとの通信に使用するバインディングを作成するときには、サービスとまったく同じバインディングを使用するように注意する必要があります。 唯一の相違点は、クライアント バインディングの場合は、DiscoveryClientBindingElement がスタックの一番上にあることです。 サービスが、システムによって提供されるバインディングの 1 つを使用している場合は、新しい CustomBinding を作成し、システムによって提供されるバインディングを CustomBinding コンストラクターに渡します。 次に、DiscoveryClientBindingElementInsert プロパティで呼び出して、Elements を追加できます。

DiscoveryClientBindingElement をバインディングに追加し、構成したら、WCF クライアント クラスのインスタンスを作成し、それを開いて、そのメソッドを呼び出すことができます。 次の例では、探索クライアント チャネルを使用して、ICalculator クラス (WCF の入門チュートリアルで使用するクラス) を実装し、その Add メソッドを呼び出す、WCF サービスを探索します。

// Create the DiscoveryClientBindingElement  
DiscoveryClientBindingElement bindingElement = new DiscoveryClientBindingElement();  
// Search for a service that implements the ICalculator interface, attempting to open  
// the channel a maximum of 2 times  
bindingElement.FindCriteria = new FindCriteria(typeof(ICalculator)) { MaxResults = 2 };  
// Use the UdpDiscoveryEndpoint  
bindingElement.DiscoveryEndpoint = new UdpDiscoveryEndpoint();  
  
// The service uses the BasicHttpBinding, so use that and insert the DiscoveryClientBindingElement at the
// top of the stack  
CustomBinding binding = new CustomBinding(new BasicHttpBinding());  
binding.Elements.Insert(0,bindingElement);  
  
try  
{  
    // Create the WCF client and call a method  
    CalculatorClient client = new CalculatorClient(binding, new EndpointAddress("http://schemas.microsoft.com/dynamic"));  
    client.Open();  
    client.Add(1, 1);  
}  
catch (EndpointNotFoundException ex)  
{  
    Console.WriteLine("An exception occurred: " + ex.Message);  
}  

セキュリティおよび探索クライアント チャネル

探索クライアント チャネルの使用時には、2 つのエンドポイントが指定されます。 1 つは探索メッセージ用に使用されるエンドポイント (通常は UdpDiscoveryEndpoint) で、もう 1 つはアプリケーション エンドポイントです。 セキュリティで保護されたサービスを実装するときには、両方のエンドポイントを保護するように注意する必要があります。 セキュリティの詳細については、「サービスおよびクライアントのセキュリティ保護」を参照してください。