DiscoveryClient und DynamicEndpointDiscoveryClient and DynamicEndpoint

DiscoveryClient und DynamicEndpoint sind zwei Klassen, die auf der Clientseite zum Suchen nach Diensten verwendet werden.DiscoveryClient and DynamicEndpoint are two classes used on the client side to search for services. DiscoveryClient stellt eine Liste der Dienste bereit, die bestimmten Kriterien entsprechen, und ermöglicht Ihnen das Herstellen einer Verbindung mit den Diensten.DiscoveryClient provides you with a list of services that match a specific set of criteria and allows you to connect to the services. DynamicEndpoint führt den gleichen Vorgang aus und stellt zusätzlich eine Verbindung mit einem der gefundenen Dienste her.DynamicEndpoint performs the same operation and in addition, automatically connects to one of the services that was found. Jeder Endpunkt kann als DynamicEndpoint festgelegt werden, und die Suchkriterien können auch in der Konfiguration hinzugefügt werden. DynamicEndpoint ist hilfreich, wenn Sie die Suche in der Projektmappe benötigen, die Clientlogik jedoch nicht ändern möchten – Sie müssen nur die Endpunkte ändern.Any endpoint can be made into a DynamicEndpoint, the search criteria can also be added in configuration, thus DynamicEndpoint is useful when you need discovery in your solution but do not want to modify the client logic – you only need to modify the endpoints. DiscoveryClient bietet Ihnen jedoch eine präzisere Steuerung des Suchvorgangs.DiscoveryClient on the other hand can be used to gain finer control over your search operation. Die Verwendungsmöglichkeiten und Vorteile der Klassen werden unten näher beschrieben.The uses and benefits of each are elaborated below.

DiscoveryClientDiscoveryClient

Der DiscoveryClient definiert synchrone und asynchrone Find-Methoden wie FindCompleted- und FindProgressChanged-Ereignisse.The DiscoveryClient defines synchronous and asynchronous Find methods, FindCompleted and FindProgressChanged events. Er definiert außerdem synchrone und asynchrone Resolve-Methoden und ein ResolveCompleted-Ereignis.It also defines synchronous and asynchronous Resolve methods and a ResolveCompleted event. Verwenden Sie die Methode Find oder FindAsync zum Suchen nach Diensten.Use the Find or FindAsync methods to search for services. Beide Methoden verwenden eine FindCriteria-Instanz, über die Sie Folgendes angeben können: Vertragstypnamen, Bereiche, maximale Anzahl an angeforderten Ergebnissen und die Übereinstimmungsregeln für Bereiche.Both of these methods take a FindCriteria instance that allows you to specify contract type names, scopes, maximum number of results requested, and scope matching rules. Beim Aufruf der FindCompleted-Methode können das FindProgressChanged-Ereignis und das FindAsync-Ereignis verwendet werden.The FindCompleted and FindProgressChanged events can be used when calling the FindAsync method. FindProgressChanged wird immer ausgelöst, wenn der DiscoveryClient eine Antwort von einem Dienst empfängt.FindProgressChanged is fired whenever the DiscoveryClient receives a response from a service. Es kann verwendet werden, um eine Statusanzeige anzuzeigen, die den Status des Suchvorgangs angibt.It can be used to display a progress bar showing the progress of the find operation. Außerdem kann es verwendet werden, um auf empfangene Suchantworten zu reagieren.It can also be used to act on find responses as they are received. Das FindCompleted-Ereignis wird nach Abschluss des Suchvorgangs ausgelöst.The FindCompleted event is fired when the find operation completes. Dies kann der Fall sein, weil die maximale Anzahl von Antworten empfangen wurde oder wenn der unter Duration festgelegte Zeitraum verstrichen ist.This may happen because the maximum number of responses has been received or if the Duration has elapsed. Nachdem der Suchvorgang abgeschlossen wurde, werden die Ergebnisse in einer FindResponse-Instanz zurückgegeben.When the find operation completes the results are returned in a FindResponse instance. FindResponse enthält eine Auflistung von EndpointDiscoveryMetadata mit den Adressen, Vertragstypnamen, Erweiterungen, Abhör-URIs und Bereichen der übereinstimmenden Dienste.The FindResponse contains a collection of EndpointDiscoveryMetadata which contains the addresses, contract type names, extensions, listen URIs, and scopes of the matching services. Sie können diese Informationen dann verwenden, um eine Verbindung zu einem der übereinstimmenden Dienste herzustellen und diesen aufzurufen.You can then use this information to connect to and call one of the matching services. Das folgende Beispiel zeigt, wie die System.ServiceModel.Discovery.DiscoveryClient.Find(System.ServiceModel.Discovery.FindCriteria)-Methode aufrufen, und die zurückgegebene Metadaten verwenden, um den gefundenen Dienst aufzurufen.The following example shows how to call the System.ServiceModel.Discovery.DiscoveryClient.Find(System.ServiceModel.Discovery.FindCriteria) method and use the returned metadata to call the found service. Der Vorteil Find(FindCriteria) darin, dass Sie die Liste der Endpunkte zwischenspeichern können Sie gefunden haben und diese zu einem späteren Zeitpunkt zu verwenden.A benefit of using Find(FindCriteria) is that you can cache the list of endpoints you’ve found and use them at a later time. Mit diesem Cache können Sie eine benutzerdefinierte Logik zur Behandlung verschiedener Fehlerbedingungen erstellen.With this cache, you can build custom logic to handle various failure conditions.

DiscoveryClient dc = new DiscoveryClient(new UdpDiscoveryEndpoint());  

FindCriteria criteria = new FindCriteria(typeof(ICalculatorService));  
FindResponse fr = dc.Find(criteria);  

if (fr.Endpoints.Count > 0)  
{  
   EndpointAddress ep = fr.Endpoints[0].Address;  
   CalculatorServiceClient client = new CalculatorServiceClient();  

    // Connect to the discovered service endpoint  
   client.Endpoint.Address = endpointAddress;  
   Console.WriteLine("Invoking CalculatorService at {0}", endpointAddress);  

   double value1 = 100.00D;  
   double value2 = 15.99D;  

   // Call the Add service operation.  
   double result = client.Add(value1, value2);  
   Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);  
}  
else  
   Console.WriteLine("No matching endpoints found");  

Das folgende Beispiel zeigt, wie Sie einen Suchvorgang asynchron ausführen.The following example shows how to perform a find operation asynchronously.

static void FindServiceAsync()  
{  
   DiscoveryClient dc = new DiscoveryClient(new UdpDiscoveryEndpoint());   
   dc.FindCompleted += new EventHandler<FindCompletedEventArgs>( discoveryClient_FindCompleted);  
   dc.FindProgressChanged += new EventHandler<FindProgressChangedEventArgs>(discoveryClient_FindProgressChanged);  
   dc.FindAsync(new FindCriteria(typeof(ICalculatorService)));   
}   
static void discoveryClient_FindProgressChanged(object sender, FindProgressChangedEventArgs e)  
{  
   Console.WriteLine("Found service at: " + e.EndpointDiscoveryMetadata.Address  
}   

static void discoveryClient_FindCompleted(object sender, FindCompletedEventArgs e)  
{    
      if (e.Result.Endpoints.Count > 0)  
            {  
                EndpointAddress ep = e.Result.Endpoints[0].Address;  
                CalculatorServiceClient client = new CalculatorServiceClient();  

                // Connect to the discovered service endpoint  
                client.Endpoint.Address = ep;  
                Console.WriteLine("Invoking CalculatorService at {0}", ep);  

                double value1 = 100.00D;  
                double value2 = 15.99D;  

                double result = client.Add(value1, value2);  
                Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);  
            }  
            else  
                Console.WriteLine("No matching endpoints found");  

        }  

Finden Sie weitere Informationen über asynchrone Aufrufe, finden Sie unter asynchrone suchen.For more information about making asynchronous find calls, see Asynchronous Find.

Verwenden Sie die Methoden Resolve und ResolveAsync(ResolveCriteria), um anhand der Endpunktadresse nach einem Dienst zu suchen.Use the Resolve and ResolveAsync(ResolveCriteria) methods to locate a service based on its endpoint address. Dies ist hilfreich, wenn die Endpunktadresse im Netzwerk nicht adressierbar ist.This is useful when the endpoint address is not network addressable. Die Resolve-Methoden verwenden eine Instanz von ResolveCriteria. Damit können Sie die Endpunktadresse des Diensts, den Sie auflösen, die Höchstdauer des Auflösungsvorgangs und eine Gruppe von Erweiterungen angeben.The Resolve methods take an instance of ResolveCriteria which allows you to specify the endpoint address of the service you are resolving, the maximum duration of the resolve operation, and a set of extensions. Das folgende Beispiel zeigt, wie Sie die Resolve-Methode zum Auflösen eines Diensts verwenden.The following example shows how to use the Resolve method to resolve a service.

DiscoveryClient dc = new DiscoveryClient(new UdpDiscoveryEndpoint());  
ResolveCriteria criteria = new ResolveCriteria(endpointAddress);  
ResolveResponse response = dc.Resolve(criteria);  
EndpointAddress newEp = response.EndpointDiscoveryMetadata.Address;  

DynamicEndpointDynamicEndpoint

DynamicEndpoint ist ein Standardendpunkt (Weitere Informationen finden Sie unter Standardendpunkte) die Erkennung und wählt automatisch einen übereinstimmenden Dienst.DynamicEndpoint is a standard endpoint (For more information, see Standard Endpoints) which performs discovery and automatically selects a matching service. Erstellen Sie einfach einen DynamicEndpoint, über den der zu suchende Vertrag und die zu verwendende Bindung übergeben werden, und übergeben Sie die DynamicEndpoint-Instanz an den WCF-Client.Just create a DynamicEndpoint passing in the contract to search for and the binding to use and pass the DynamicEndpoint instance to the WCF client. Das folgende Beispiel veranschaulicht, wie Sie einen DynamicEndpoint erstellen und verwenden, um den Rechnerdienst aufzurufen.The following example shows how to create and use a DynamicEndpoint to call the calculator service. Die Suche wird jeweils ausgeführt, wenn der Client geöffnet wird.The discovery is performed every time the client is opened. Jeder Endpunkt in der Konfiguration definierte kann ebenfalls aktiviert werden, in einer DynamicEndpoint durch Hinzufügen der kind ="dynamicEndpoint" -Attribut auf die Endpunkt-Konfigurationselement.Any endpoint defined in configuration can also be turned into a DynamicEndpoint by adding the kind ="dynamicEndpoint" attribute to the endpoint configuration element.

DynamicEndpoint dynamicEndpoint = new DynamicEndpoint(ContractDescription.GetContract(typeof(ICalculatorService)), new WSHttpBinding());  
CalculatorServiceClient client = new CalculatorServiceClient(dynamicEndpoint);  

Console.WriteLine("Invoking CalculatorService");  
Console.WriteLine();  

double value1 = 100.00D;  
double value2 = 15.99D;  

double result = client.Add(value1, value2);  
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);  

Siehe auchSee Also

Suche mit BereichenDiscovery with Scopes
Asynchrone SucheAsynchronous Find
StandardBasic