Sdílet prostřednictvím


Použití kanálu klienta zjišťování

Při psaní klientské aplikace WCF potřebujete znát adresu koncového bodu služby, kterou voláte. V mnoha situacích není adresa koncového bodu služby předem známa ani adresa služby se v průběhu času mění. Kanál klienta zjišťování umožňuje napsat klientskou aplikaci WCF, popsat službu, kterou chcete volat, a klientský kanál automaticky odešle požadavek sondy. Když služba odpoví, klientský kanál zjišťování načte adresu koncového bodu služby z odpovědi sondy a použije ji k volání služby.

Použití kanálu klienta zjišťování

Pokud chcete použít kanál klienta zjišťování, přidejte do zásobníku DiscoveryClientBindingElement kanálu klienta instanci. Alternativně můžete použít DynamicEndpoint a DiscoveryClientBindingElement automaticky se přidá do vazby, pokud ještě není k dispozici.

Upozornění

Doporučuje se, aby se jedná o nejvýraznější prvek v zásobníku DiscoveryClientBindingElement kanálu klienta. Všechny prvky vazby přidané nad rámec DiscoveryClientBindingElement musí zajistit, aby ChannelFactory kanál, který vytváří, nepoužívali adresu koncového bodu nebo Via adresu (předanou CreateChannel metodě), protože nemusí obsahovat správnou adresu.

Třída DiscoveryClientBindingElement obsahuje dvě veřejné vlastnosti:

  1. FindCriteria, který se používá k popisu služby, kterou chcete volat.

  2. DiscoveryEndpointProvider určuje koncový bod zjišťování, do kterého se mají odesílat zprávy zjišťování.

Vlastnost FindCriteria umožňuje zadat kontrakt služby, který hledáte, všechny požadované identifikátory URI oboru a maximální počet času pokusu o otevření kanálu. Typ kontraktu je určen voláním konstruktoru FindCriteria. Identifikátory URI oboru lze přidat do Scopes vlastnosti. Vlastnost MaxResults umožňuje zadat maximální počet výsledků, ke kterým se klient pokusí připojit. Při přijetí odpovědi sondy se klient pokusí kanál otevřít pomocí adresy koncového bodu z odpovědi sondy. Pokud dojde k výjimce, klient přejde na další odpověď sondy, v případě potřeby čeká na přijetí dalších odpovědí. Bude pokračovat, dokud se kanál úspěšně neotevře nebo nedosáhne maximálního počtu výsledků. Další informace o těchto nastaveních naleznete v tématu FindCriteria.

Tato DiscoveryEndpointProvider vlastnost umožňuje zadat koncový bod zjišťování, který se má použít. Obvykle se jedná o UdpDiscoveryEndpointplatný koncový bod, ale může to být jakýkoli platný koncový bod.

Při vytváření vazby, která se má použít ke komunikaci se službou, musíte být opatrní, abyste použili úplně stejnou vazbu jako služba. Jediným rozdílem DiscoveryClientBindingElement je, že vazba klienta má v horní části zásobníku. Pokud služba používá některou ze systémových vazeb, vytvořte novou CustomBinding a předejte systémovou vazbu konstruktoru CustomBinding . Potom můžete přidat DiscoveryClientBindingElement voláním Insert vlastnosti Elements .

Jakmile do vazby přidáte DiscoveryClientBindingElement a nakonfigurujete ji, můžete vytvořit instanci klientské třídy WCF, otevřít ji a volat její metody. Následující příklad používá kanál klienta zjišťování ke zjištění služby WCF, která implementuje ICalculator třídu (používá se v kurzu Začínáme WCF) a volá její Add metodu.

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

Zabezpečení a kanál klienta zjišťování

Při použití kanálu klienta zjišťování se zadají dva koncové body. Jeden se používá pro zprávy zjišťování, obvykle UdpDiscoveryEndpointa druhý je koncový bod aplikace. Při implementaci zabezpečené služby je potřeba zajistit zabezpečení obou koncových bodů. Další informace o zabezpečení naleznete v tématu Zabezpečení služeb a klientů.