Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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 :
FindCriteria, qui est utilisé pour décrire le service que vous souhaitez appeler.
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.