Delen via


Het Discovery Client-kanaal gebruiken

Wanneer u een WCF-clienttoepassing schrijft, moet u het eindpuntadres weten van de service die u aanroept. In veel situaties is het eindpuntadres van een service niet van tevoren bekend of is het adres van de service in de loop van de tijd gewijzigd. Met het Discovery Client-kanaal kunt u een WCF-clienttoepassing schrijven, de service beschrijven die u wilt aanroepen en het clientkanaal automatisch een testaanvraag verzendt. Wanneer een service reageert, haalt het detectieclientkanaal het eindpuntadres voor de service op uit het testantwoord en gebruikt het om de service aan te roepen.

Het Discovery Client-kanaal gebruiken

Als u het Discovery Client-kanaal wilt gebruiken, voegt u een exemplaar van de DiscoveryClientBindingElement clientkanaalstack toe. U kunt ook de DynamicEndpoint binding gebruiken en er wordt automatisch een DiscoveryClientBindingElement toegevoegd aan uw binding als deze nog niet aanwezig is.

Let op

Het wordt aanbevolen om het DiscoveryClientBindingElement bovenste element op uw clientkanaalstack te zijn. Elk bindingselement dat boven op het DiscoveryClientBindingElement element wordt toegevoegd, moet ervoor zorgen dat het eindpuntadres of Via -adres (doorgegeven aan de CreateChannel methode) niet wordt gebruikt door het ChannelFactory kanaal dat wordt gemaakt, omdat deze mogelijk niet het juiste adres bevatten.

De DiscoveryClientBindingElement klasse bevat twee openbare eigenschappen:

  1. FindCriteria, dat wordt gebruikt om de service te beschrijven die u wilt aanroepen.

  2. DiscoveryEndpointProvider waarmee het detectie-eindpunt wordt opgegeven waarnaar detectieberichten moeten worden verzonden.

Met FindCriteria de eigenschap kunt u het servicecontract opgeven dat u zoekt, eventuele vereiste bereik-URI's en het maximale aantal tijd dat u het kanaal wilt openen. Het contracttype wordt opgegeven door de constructor FindCriteriaaan te roepen. Bereik-URI's kunnen worden toegevoegd aan de Scopes eigenschap. Met MaxResults de eigenschap kunt u het maximum aantal resultaten opgeven waarmee de client verbinding probeert te maken. Wanneer een testantwoord wordt ontvangen, probeert de client het kanaal te openen met behulp van het eindpuntadres van het testantwoord. Als er een uitzondering optreedt, gaat de client door naar het volgende testantwoord en wacht u zo nodig tot er meer antwoorden worden ontvangen. Dit blijft doen totdat het kanaal is geopend of het maximum aantal resultaten is bereikt. Zie FindCriteriavoor meer informatie over deze instellingen.

Met de DiscoveryEndpointProvider eigenschap kunt u het detectie-eindpunt opgeven dat moet worden gebruikt. Normaal gesproken is dit een UdpDiscoveryEndpoint, maar het kan elk geldig eindpunt zijn.

Wanneer u de binding maakt die moet worden gebruikt om met de service te communiceren, moet u ervoor zorgen dat u exact dezelfde binding als de service gebruikt. Het enige verschil is dat de clientbinding een DiscoveryClientBindingElement boven aan de stack heeft. Als de service een van de door het systeem geleverde bindingen gebruikt, maakt u een nieuwe CustomBinding binding en geeft u de door het systeem geleverde binding door aan de CustomBinding constructor. Vervolgens kunt u de DiscoveryClientBindingElement eigenschap toevoegen door de eigenschap aan te Elements roepenInsert.

Nadat u de DiscoveryClientBindingElement binding hebt toegevoegd en geconfigureerd, kunt u een exemplaar van de WCF-clientklasse maken, openen en de methoden aanroepen. In het volgende voorbeeld wordt het Discovery Client-kanaal gebruikt om een WCF-service te detecteren waarmee de ICalculator klasse (gebruikt in de zelfstudie Aan de slag met WCF) wordt geïmplementeerd en de methode wordt Add aangeroepen.

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

Beveiliging en het Discovery-clientkanaal

Wanneer u het detectieclientkanaal gebruikt, worden er twee eindpunten opgegeven. De ene wordt gebruikt voor detectieberichten, meestal UdpDiscoveryEndpointen de andere is het eindpunt van de toepassing. Bij het implementeren van een beveiligde service moet u ervoor zorgen dat beide eindpunten worden beveiligd. Zie Services en clients beveiligen voor meer informatie over beveiliging.