Verwenden des SuchclientchannelsUsing the Discovery Client Channel

Beim Schreiben einer WCF-Clientanwendung müssen Sie die Endpunktadresse des Diensts kennen, den Sie aufrufen.When writing a WCF client application you need to know the endpoint address of the service you are calling. In vielen Situationen ist die Endpunktadresse eines Diensts nicht im Voraus bekannt, oder die Adresse des Diensts ändert sich im Laufe der Zeit.In many situations the endpoint address of a service is not known in advance or the address of the service changes over time. Mithilfe des Discovery-Clientchannels können Sie eine WCF-Clientanwendung schreiben und den aufzurufenden Dienst beschreiben. Der Client sendet dann automatisch eine Überprüfungsanforderung.The Discovery Client Channel allows you to write a WCF client application, describe the service you want to call, and the client channel automatically sends a probe request. Wenn ein Dienst antwortet, ruft der Discovery-Clientchannel die Endpunktadresse für den Dienst aus der Überprüfungsantwort ab und verwendet diese zum Aufrufen des Diensts.When a service responds, the discovery client channel retrieves the endpoint address for the service from the probe response and uses it to call the service.

Verwenden des SuchclientchannelsUsing the Discovery Client Channel

Um den Discovery-Clientchannel zu verwenden, fügen Sie dem Clientchannelstapel eine DiscoveryClientBindingElement-Instanz hinzu.To use the Discovery Client Channel, add an instance of the DiscoveryClientBindingElement to your client channel stack. Alternativ dazu können Sie das DynamicEndpoint-Objekt verwenden. Der Bindung wird dann automatisch ein DiscoveryClientBindingElement-Objekt hinzugefügt, falls diese nicht bereits vorhanden ist.Alternatively you can use the DynamicEndpoint and a DiscoveryClientBindingElement is automatically added to your binding if not already present.

Achtung

Es wird empfohlen, das DiscoveryClientBindingElement-Objekt im Clientchannelstapel als oberstes Element zu verwenden.It is recommended that the DiscoveryClientBindingElement is the top-most element on your client channel stack. Für jedes Bindungselement, das zusätzlich zum DiscoveryClientBindingElement-Objekt hinzugefügt wird, muss sichergestellt sein, dass das ChannelFactory-Objekt bzw. der erstellte Channel nicht die Endpunktadresse oder die Via-Adresse (die an die CreateChannel-Methode übergeben wird) verwendet. Es kann nämlich sein, dass darin nicht die richtige Adresse enthalten ist.Any binding element that is added on top of the DiscoveryClientBindingElement must make sure that the ChannelFactory or channel it creates does not use the endpoint address or Via address (passed to the CreateChannel method) because they may not contain the correct address.

Die DiscoveryClientBindingElement-Klasse enthält zwei öffentliche Eigenschaften:The DiscoveryClientBindingElement class contains two public properties:

  1. FindCriteria wird verwendet, um den Dienst zu beschreiben, den Sie aufrufen möchten.FindCriteria, which is used to describe the service you want to call.

  2. DiscoveryEndpointProvider die gibt des suchendpunkt auf Suchnachrichten gesendet.DiscoveryEndpointProvider which specifies the discovery endpoint to send discovery messages to.

Mit der FindCriteria-Eigenschaft können Sie den Dienstvertrag angeben, nach dem Sie suchen, sowie alle erforderlichen Bereichs-URIs und den maximalen Zeitraum, wie lange versucht wird, den Channel zu öffnen.The FindCriteria property allows you to specify the service contract you are searching for, any required scope URIs, and the maximum number of time to attempt to open the channel. Der Typ des Vertrags wird angegeben, indem der Konstruktor FindCriteria.The contract type is specified by calling the constructor FindCriteria. Der Scopes-Eigenschaft können Bereichs-URIs hinzugefügt werden.Scope URIs can be added to the Scopes property. Mithilfe der MaxResults-Eigenschaft können Sie die maximale Anzahl von Ergebnissen angeben, für die der Client das Herstellen einer Verbindung versucht.The MaxResults property allows you to specify the maximum number of results to which the client tries to connect to. Wenn eine Überprüfungsantwort empfangen wird, versucht der Client, den Channel mit der Endpunktadresse aus der Überprüfungsantwort zu öffnen.When a probe response is received the client attempts to open the channel using the endpoint address from the probe response. Wenn eine Ausnahme auftritt, fährt der Client mit der nächsten Überprüfungsantwort fort und wartet auf weitere Antworten, sofern dies erforderlich ist.If an exception occurs the client moves on to the next probe response, waiting for more responses to be received if necessary. Dies dauert so lange an, bis der Channel erfolgreich geöffnet oder die maximale Anzahl an Ergebnissen erreicht wurde.It continues to do this until the channel is successfully opened or the maximum number of results is reached. Weitere Informationen zu diesen Einstellungen finden Sie unter FindCriteria.For more information about these settings, see FindCriteria.

Mit der DiscoveryEndpointProvider-Eigenschaft können Sie den zu verwendenden Suchendpunkt angeben.The DiscoveryEndpointProvider property allows you to specify the discovery endpoint to use. Normalerweise ist dies ein UdpDiscoveryEndpoint-Objekt, aber es kann sich um jeden gültigen Endpunkt handeln.Normally this is a UdpDiscoveryEndpoint, but it can be any valid endpoint.

Wenn Sie die Bindung für die Kommunikation mit dem Dienst erstellen, müssen Sie darauf achten, genau die gleiche Bindung wie der Dienst zu verwenden.When you are creating the binding to use to communicate with the service, you must be careful to use the exact same binding as the service. Der einzige Unterschied besteht darin, dass die Clientbindung oben im Stapel über ein DiscoveryClientBindingElement-Objekt verfügt.The only difference is the client binding has a DiscoveryClientBindingElement on the top of the stack. Falls der Dienst eine der vom System bereitgestellten Bindungen verwendet, erstellen Sie ein neues CustomBinding-Objekt und übergeben die vom System bereitgestellte Bindung an den CustomBinding-Konstruktor.If service is using one of the system-provided bindings, create a new CustomBinding and pass in the system-provided binding to the CustomBinding constructor. Anschließend können Sie DiscoveryClientBindingElement hinzufügen, indem Sie Insert für die Elements-Eigenschaft aufrufen.Then you can add the DiscoveryClientBindingElement by calling Insert on the Elements property.

Nachdem Sie DiscoveryClientBindingElement der Bindung hinzugefügt und diese konfiguriert haben, können Sie eine Instanz der WCF-Clientklasse erstellen, diese öffnen und ihre Methoden aufrufen.Once you have added the DiscoveryClientBindingElement to your binding and configured it, you can create an instance of the WCF client class, open it, and call its methods. Im folgenden Beispiel wird der Discovery-Clientchannel verwendet, um einen WCF-Dienst zu ermitteln, der die ICalculator-Klasse implementiert (verwendet im WCF-Lernprogramm "Erste Schritte") und die dazugehörige Add-Methode aufruft.The following example uses the Discovery Client Channel to discover a WCF service that implements the ICalculator class (used in the Getting Started WCF tutorial) and calls its Add method.

// 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);  
}  

Sicherheit und der Discovery-ClientchannelSecurity and the Discovery Client Channel

Bei der Verwendung des Discovery-Clientchannels werden zwei Endpunkte angegeben.When using the discovery client channel, two endpoints are being specified. Einer wird für Suchnachrichten verwendet, normalerweise UdpDiscoveryEndpoint, und der andere ist der Anwendungsendpunkt.One is used for discovery messages, usually UdpDiscoveryEndpoint, and the other is the application endpoint. Achten Sie beim Implementieren eines sicheren Diensts besonders auf die Sicherheit der beiden Endpunkte.When implementing a secure service, care must be taken to secure both endpoints. Weitere Informationen zur Sicherheit finden Sie unter Sichern von Diensten und Clients.For more information about security, see Securing Services and Clients.