Använda identifieringsklientkanalen
När du skriver ett WCF-klientprogram måste du känna till slutpunktsadressen för den tjänst som du anropar. I många situationer är slutpunktsadressen för en tjänst inte känd i förväg eller så ändras adressen till tjänsten över tid. Med Identifieringsklientkanalen kan du skriva ett WCF-klientprogram, beskriva den tjänst som du vill anropa och klientkanalen skickar automatiskt en avsökningsbegäran. När en tjänst svarar hämtar identifieringsklientkanalen slutpunktsadressen för tjänsten från avsökningssvaret och använder den för att anropa tjänsten.
Använda identifieringsklientkanalen
Om du vill använda identifieringsklientkanalen lägger du till en instans av DiscoveryClientBindingElement i klientkanalstacken. Du kan också använda DynamicEndpoint och en DiscoveryClientBindingElement läggs automatiskt till i bindningen om den inte redan finns.
Varning
Vi rekommenderar att DiscoveryClientBindingElement är det översta elementet i klientkanalstacken. Alla bindningselement som läggs till ovanpå DiscoveryClientBindingElement måste se till att den ChannelFactory eller kanal som skapas inte använder slutpunktsadressen eller Via
adressen (skickas till CreateChannel
metoden) eftersom de kanske inte innehåller rätt adress.
Klassen DiscoveryClientBindingElement innehåller två offentliga egenskaper:
FindCriteria, som används för att beskriva den tjänst som du vill anropa.
DiscoveryEndpointProvider som anger den identifieringsslutpunkt som identifieringsmeddelanden ska skickas till.
Med FindCriteria egenskapen kan du ange det tjänstkontrakt som du söker efter, eventuella nödvändiga omfångs-URI:er och det maximala antalet försök att öppna kanalen. Kontraktstypen anges genom att anropa konstruktorn FindCriteria. Omfångs-URI:er kan läggas till i egenskapen Scopes . Med MaxResults egenskapen kan du ange det maximala antalet resultat som klienten försöker ansluta till. När ett avsökningssvar tas emot försöker klienten öppna kanalen med hjälp av slutpunktsadressen från avsökningssvaret. Om ett undantag inträffar går klienten vidare till nästa avsökningssvar och väntar på att fler svar ska tas emot om det behövs. Det fortsätter att göra detta tills kanalen har öppnats eller det maximala antalet resultat har uppnåtts. Mer information om de här inställningarna finns i FindCriteria.
Med DiscoveryEndpointProvider egenskapen kan du ange den identifieringsslutpunkt som ska användas. Normalt är detta en UdpDiscoveryEndpoint, men det kan vara vilken giltig slutpunkt som helst.
När du skapar bindningen som ska användas för att kommunicera med tjänsten måste du vara noga med att använda exakt samma bindning som tjänsten. Den enda skillnaden är att klientbindningen har en DiscoveryClientBindingElement överst i stacken. Om tjänsten använder en av bindningarna som tillhandahålls av systemet skapar du en ny CustomBinding och skickar den systembaserade bindningen CustomBinding till konstruktorn. Sedan kan du lägga till genom att DiscoveryClientBindingElement anropa Insert
egenskapen Elements .
När du har lagt till bindningen DiscoveryClientBindingElement och konfigurerat den kan du skapa en instans av WCF-klientklassen, öppna den och anropa dess metoder. I följande exempel används identifieringsklientkanalen för att identifiera en WCF-tjänst som implementerar ICalculator
klassen (används i WCF-självstudien Komma igång) och anropar dess Add
metod.
// 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);
}
Säkerhet och identifieringsklientkanalen
När du använder identifieringsklientkanalen anges två slutpunkter. Den ena används för identifieringsmeddelanden, vanligtvis UdpDiscoveryEndpoint, och den andra är programslutpunkten. När du implementerar en säker tjänst måste du vara noga med att skydda båda slutpunkterna. Mer information om säkerhet finns i Skydda tjänster och klienter.