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:
FindCriteria, který se používá k popisu služby, kterou chcete volat.
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ů.