Partager via


Utilisation du canal de client Discovery

Lorsque vous écrivez une application cliente WCF, vous devez connaître l’adresse de point de terminaison du service que vous appelez. Dans de nombreuses situations, l’adresse du point de terminaison d’un service n’est pas connue à l’avance ou l’adresse du service change au fil du 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 requête de sonde. Lorsqu’un service répond, le canal client de découverte récupère l’adresse de point de terminaison du service à partir de la réponse de la sonde et l’utilise pour appeler le service.

Utilisation du canal de client Discovery

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

Avertissement

Il est recommandé que DiscoveryClientBindingElement soit l'élément le plus haut sur votre pile de canaux clients. Tout élément de liaison ajouté au-dessus de DiscoveryClientBindingElement doit s'assurer que le ChannelFactory ou le canal qu'il crée n'utilise pas l'adresse de point de terminaison ou l'adresse de Via (passée à la méthode CreateChannel), car elles peuvent ne pas contenir l'adresse correcte.

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

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

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

La FindCriteria propriété vous permet de spécifier le contrat de service que vous recherchez, toutes les URI d’étendue requises et le nombre maximal de temps pour tenter d’ouvrir le canal. Le type de contrat est spécifié en appelant le constructeur FindCriteria. Les URI de portée peuvent être ajoutées à la propriété Scopes. La MaxResults propriété vous permet de spécifier le nombre maximal de résultats auxquels le client tente 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 la sonde. Si une exception se produit, le client passe à la réponse de la sonde suivante, en attendant que d’autres réponses soient reçues si nécessaire. Cela continue jusqu’à ce que le canal soit correctement ouvert ou que le nombre maximal de résultats soit atteint. Pour plus d’informations sur ces paramètres, consultez FindCriteria.

La DiscoveryEndpointProvider propriété vous permet de spécifier le point de terminaison de découverte à utiliser. Normalement, il s'agit d'un UdpDiscoveryEndpoint, mais il peut s'agir de n'importe quel point de terminaison valide.

Lorsque vous créez la liaison à utiliser pour communiquer avec le service, veillez à 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 nouvel objet CustomBinding en utilisant la liaison fournie par le système, et transmettez cette liaison au constructeur CustomBinding. Vous pouvez ensuite ajouter le DiscoveryClientBindingElement en appelant Insert sur la propriété Elements.

Une fois que vous avez ajouté la DiscoveryClientBindingElement liaison et l’avez configurée, vous pouvez créer une instance de la classe cliente 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 ICalculator classe (utilisée dans le didacticiel Getting Started WCF) et appelle sa Add méthode.

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

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

Lorsque vous utilisez le canal client de découverte, deux points de terminaison sont spécifiés. L’un est utilisé pour les messages de découverte, généralement UdpDiscoveryEndpoint, et l’autre est le point de terminaison de l’application. Lors de l’implémentation d’un service sécurisé, vous devez veiller à sécuriser les deux points de terminaison. Pour plus d’informations sur la sécurité, consultez Sécurisation des services et des clients.