DiscoveryClient und DynamicEndpoint

DiscoveryClient und DynamicEndpoint sind zwei Klassen, die auf der Clientseite zum Suchen nach Diensten verwendet werden.DiscoveryClient stellt eine Liste der Dienste bereit, die bestimmten Kriterien entsprechen, und ermöglicht Ihnen das Herstellen einer Verbindung zu den Diensten.DynamicEndpoint führt den gleichen Vorgang aus und stellt zusätzlich eine Verbindung zu einem der gefundenen Dienste her.Jeder Endpunkt kann zu einem DynamicEndpoint werden, und die Suchkriterien können auch in der Konfiguration hinzugefügt werden. DynamicEndpoint ist also nützlich, wenn Sie die Suche in der Projektmappe benötigen, aber die Clientlogik nicht ändern möchten – Sie müssen nur die Endpunkte ändern.DiscoveryClient erhalten Sie jedoch eine präzisere Kontrolle über den Suchvorgang.Die Verwendungsmöglichkeiten und Vorteile der Klassen werden unten näher beschrieben.

DiscoveryClient

Der DiscoveryClient definiert synchrone und asynchrone Find-Methoden wie FindCompleted- und FindProgressChanged-Ereignisse.Er definiert außerdem synchrone und asynchrone Resolve-Methoden und ein ResolveCompleted-Ereignis.Verwenden Sie die Methode Find oder FindAsync zum Suchen nach Diensten.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.Die Ereignisse FindCompleted und FindProgressChanged können zum Aufrufen der FindAsync-Methode verwendet werden.FindProgressChanged wird jeweils ausgelöst, wenn der DiscoveryClient eine Antwort von einem Dienst empfängt.Es kann verwendet werden, um eine Statusanzeige anzuzeigen, die den Status des Suchvorgangs angibt.Außerdem kann es verwendet werden, um auf empfangene Suchantworten zu reagieren.Das FindCompleted-Ereignis wird nach Abschluss des Suchvorgangs ausgelöst.Dies kann der Fall sein, weil die maximale Anzahl von Antworten empfangen wurde oder wenn der unter Duration festgelegte Zeitraum verstrichen ist.Nachdem der Suchvorgang abgeschlossen wurde, werden die Ergebnisse in einer FindResponse-Instanz zurückgegeben.FindResponse enthält eine Auflistung von EndpointDiscoveryMetadata mit den Adressen, Vertragstypnamen, Erweiterungen, Abhör-URIs und Bereichen der übereinstimmenden Dienste.Sie können diese Informationen dann verwenden, um eine Verbindung zu einem der übereinstimmenden Dienste herzustellen und diesen aufzurufen.Das folgende Beispiel zeigt, wie Sie die the M:System.ServiceModel.Discovery.DiscoveryClient.Find(System.ServiceModel.Discovery.FindCriteria)-Methode aufrufen und die zurückgegebenen Metadaten verwenden, um den gefundenen Dienst aufzurufen.Ein Vorteil der Verwendung von DiscoveryClient besteht darin, dass Sie die Liste der gefundenen Endpunkte zwischenspeichern und zu einem späteren Zeitpunkt verwenden können.Mit diesem Cache können Sie eine benutzerdefinierte Logik zur Behandlung verschiedener Fehlerbedingungen erstellen.

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.

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");  

        }  

Weitere Informationen finden Sie unter zum Durchführen asynchroner Suchaufrufe finden Sie unter Asynchrone Suche.

Verwenden Sie die Methoden Resolve und <xref:System.ServiceModel.Discovery.ResolveAsync%28System.ServiceModel.Discovery.ResolveCriteria%29>, um anhand der Endpunktadresse nach einem Dienst zu suchen.Dies ist hilfreich, wenn die Endpunktadresse im Netzwerk nicht adressierbar ist.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.Das folgende Beispiel zeigt, wie Sie die Resolve-Methode zum Auflösen eines Diensts verwenden.

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

DynamicEndpoint

DynamicEndpoint ist ein Standardendpunkt (Weitere Informationen finden Sie unterStandardendpunkte), der die Suche ausführt und automatisch einen übereinstimmenden Dienst auswählt.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.Das folgende Beispiel veranschaulicht, wie Sie einen DynamicEndpoint erstellen und verwenden, um den Rechnerdienst aufzurufen.Die Suche wird jeweils ausgeführt, wenn der Client geöffnet wird.Jeder in der Konfiguration definierte Endpunkt kann auch in einen DynamicEndpoint umgewandelt werden, indem dem Endpunkt-Konfigurationselement das kind =”dynamicEndpoint”-Attribut hinzugefügt wird.


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 auch

Suche mit Bereichen
Asynchrone Suche
Standard