次の方法で共有


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

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 がある点です。 サービスがシステム提供のバインディングのいずれかを使用している場合は、新しい CustomBinding を作成し、システム提供のバインディングを CustomBinding コンストラクターに渡します。 その後、DiscoveryClientBindingElement プロパティでInsertを呼び出すことで、Elementsを追加できます。

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

// 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 つはアプリケーション エンドポイントです。 セキュリティで保護されたサービスを実装する場合は、両方のエンドポイントをセキュリティで保護するように注意する必要があります。 セキュリティの詳細については、「 サービスとクライアントのセキュリティ保護」を参照してください。