Partager via


Utilisation du canal client de découverte

Lors de l'écriture d'une application cliente WCF vous devez connaître l'adresse du point de terminaison du service que vous appelez. Dans de nombreux cas, l'adresse du point de terminaison d'un service n'est pas connue à l'avance ou bien l'adresse du service change avec le temps. Le canal client de découverte vous permet d'écrire une application cliente WCF, de décrire le service que vous souhaitez appeler, et le canal client envoie automatiquement une demande de sonde. Lorsqu'un service répond, le canal client de découverte extrait de la réponse de sonde l'adresse du point de terminaison du service et l'utilise pour appeler le service.

Utilisation du canal client de découverte

Pour utiliser le canal client de découverte, ajoutez une instance de DiscoveryClientBindingElement à la pile des canaux de votre client. Vous pouvez également utiliser l'objet DynamicEndpoint et un élément DiscoveryClientBindingElement est automatiquement ajouté à votre liaison, s'il n'est pas déjà présent.

Dd456780.Caution(fr-fr,VS.100).gifAttention :
Il est recommandé de placer DiscoveryClientBindingElement au niveau supérieur sur votre pile des canaux clients. Tout élément de liaison ajouté par-dessus DiscoveryClientBindingElement doit s'assurer que l'objet ChannelFactory, ou le canal qu'il crée, n'utilise pas l'adresse du point de terminaison ni l'adresse Via (transmise à la méthode CreateChannel). Elles risquent en effet de ne pas contenir d'adresse correcte.

La classe DiscoveryClientBindingElement contient deux propriétés publiques :

  1. FindCriteria, utilisée pour décrire le service que vous souhaitez appeler.

  2. DiscoveryEndpoint, qui spécifie le point de terminaison de découverte auquel envoyer des messages de découverte.

La propriété FindCriteria vous permet de spécifier le contrat de service que vous recherchez, un URI d'étendue requis et la durée maximale de tentative d'ouverture du canal. Le type de contrat est spécifié en appelant le constructeur FindCriteria. Des URI d'étendue peuvent être ajoutés à la propriété Scopes. La propriété MaxResults vous permet de spécifier le nombre maximal de résultats auxquels le client essaie de se connecter. Lorsqu'une réponse de sonde est reçue, le client tente d'ouvrir le canal à l'aide de l'adresse du point de terminaison de la réponse de sonde. Si une exception se produit, le client passe à la réponse de sonde suivante, en attendant que davantage de réponses soit reçues, si nécessaire. Il continue à procéder ainsi jusqu'à ce que le canal s'ouvre avec succès ou que le nombre maximal de résultats soit atteint. Pour plus d'informations sur le sujet suivant ces paramètres, consultez FindCriteria.

La propriété DiscoveryEndpoint vous permet de spécifier le point de terminaison de découverte à utiliser. Normalement, c'est un UdpDiscoveryEndpoint, mais il peut s'agir de tout point de terminaison valide.

Lorsque vous créez la liaison à utiliser pour communiquer avec le service, vous devez veiller à utiliser exactement la même liaison que le service. La seule différence est que la liaison cliente a un DiscoveryClientBindingElement sur le haut de la pile. Si le service utilise l'une des liaisons fournies par le système, créez un CustomBinding et passez la liaison fournie par le système au constructeur CustomBinding. Vous pouvez ensuite ajouter le DiscoveryClientBindingElement en appelant Insert sur la propriété Elements.

Une fois que vous avez ajouté le DiscoveryClientBindingElement à votre liaison et que vous l'avez configuré, vous pouvez créer une instance de la classe de client WCF, l'ouvrir et appeler ses méthodes. L'exemple suivant utilise le canal client de découverte pour découvrir un service WCF qui implémente la classe ICalculator (utilisée dans le didacticiel de mise en route de WCF) et appelle sa méthode Add.

// 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("https://schemas.microsoft.com/dynamic"));
    client.Open();
    client.Add(1, 1);
}
catch (EndpointNotFoundException ex)
{
    Console.WriteLine("An exception occurred: " + ex.Message);
}

La sécurité et le canal client de découverte

Lors de l'utilisation du canal client de découverte, deux points de terminaison sont spécifiés. L'un, UdpDiscoveryEndpoint habituellement, est utilisé pour les messages de découverte et l'autre est le point de terminaison d'application. Lors de l'implémentation d'un service sécurisé, il faut veiller à sécuriser les deux points de terminaison. Pour plus d'informations sur le sujet suivant la sécurité, consultez Sécurisation des services et des clients.