Recherche de découverte et FindCriteria
Une opération de recherche de découverte est lancée par un client pour découvrir un ou plusieurs services ; il s'agit de l'une des principales actions de la découverte. Effectuer une recherche envoie un message Probe WS-Discovery sur le réseau. Les services qui correspondent aux critères spécifiés répondent avec des messages WS-Discovery ProbeMatch. Pour plus d’informations sur les messages de découverte, consultez Spécification WS-Discovery.
DiscoveryClient
La classe DiscoveryClient fournit le mécanisme pour effectuer des opérations de recherche et permet d'effectuer plus facilement des opérations clientes de découverte. Elle contient une méthode Find, qui effectue une recherche synchrone (bloquante), et une méthode FindAsync, qui initialise une recherche asynchrone non bloquante. Ces deux méthodes prennent un paramètre FindCriteria et fournissent les résultats à l'utilisateur via un objet FindResponse.
FindCriteria
FindCriteria possède plusieurs propriétés, qui peuvent être regroupées en critères de recherche (spécifiant les services recherchés) et critères d'arrêt de la recherche (durée de la recherche). Un FindCriteria peut contenir plusieurs critères de recherche. Par défaut, le service doit correspondre à tous les composants, autrement, il ne se considère pas comme un service correspondant. Si vous souhaitez rechercher des services qui correspondent uniquement à certains critères, vous pouvez implémenter une logique de recherche personnalisée sur le service ou utiliser plusieurs requêtes.
Les critères de recherche incluent :
ContractTypeNameElement : facultatif. Nom de contrat du service recherché et critères habituellement utilisés lors de la recherche d'un service. Si plusieurs noms de contrat sont spécifiés, seuls les points de terminaison de service correspondant à TOUS les contrats répondent. Notez que dans WCF, un point de terminaison ne peut prendre en charge qu’un seul contrat.
ScopeElement : facultatif. Les étendues sont des URI absolus utilisés pour définir les catégories de points de terminaison de service individuels. Vous pouvez les utiliser dans des scénarios où plusieurs points de terminaison exposent le même contrat, lorsque vous souhaitez rechercher un sous-ensemble des points de terminaison. Si plusieurs étendues sont spécifiées, seuls les points de terminaison de service correspondant à TOUTES les étendues répondent.
ScopeMatchBy : spécifie l'algorithme de correspondance à utiliser, lors de la comparaison des étendues dans le message Probe avec celles du point de terminaison. Il existe cinq règles de correspondance d'étendues prises en charge :
FindCriteria.ScopeMatchByExact fait une comparaison de chaînes de base sensible à la casse.
FindCriteria.ScopeMatchByPrefix correspond par segments séparés par « / ». Une recherche de
http://contoso/building1
correspond à un service avec l’étenduehttp://contoso/building/floor1
. Notez qu’il ne correspond pas àhttp://contoso/building100
car les deux derniers segments ne correspondent pas.FindCriteria.ScopeMatchByLdap établit une correspondance des étendues par segments à l'aide d'une URL LDAP.
FindCriteria.ScopeMatchByUuid établit une correspondance exacte des étendues, à l'aide d'une chaîne UUID.
FindCriteria.ScopeMatchByNone correspond uniquement aux services qui ne spécifient pas d'étendue.
Si une règle de correspondance d'étendue n'est pas spécifiée, ScopeMatchByPrefix est utilisée.
Les critères d'arrêt sont les suivants :
Duration : temps d'attente maximal pour que les services répondent sur le réseau. La durée par défaut est de 20 secondes.
MaxResults : nombre maximal de réponses à attendre. Si les réponses MaxResults sont reçues avant que la propriété Duration expire, l'opération de recherche prend fin.
FindResponse
FindResponse a une propriété de collection Endpoints qui contient toutes les réponses envoyées en mettant en correspondance les services sur le réseau. Si aucun service n’a répondu, la collection est vide. Si un ou plusieurs services ont répondu, chaque réponse est stockée dans un objet EndpointDiscoveryMetadata, qui contient l'adresse, le contrat et quelques informations supplémentaires sur le service.
L'exemple suivant indique comment effectuer une opération de recherche dans le code.
// Create DiscoveryClient
DiscoveryClient discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint());
// Create FindCriteria
FindCriteria findCriteria = new FindCriteria(typeof(IPrinterService));
findCriteria.Scopes.Add(new Uri("http://www.contoso.com/building1/floor1"));
findCriteria.Duration = TimeSpan.FromSeconds(10);
// Find ICalculatorService endpoints
FindResponse findResponse = discoveryClient.Find(findCriteria);
Console.WriteLine("Found {0} ICalculatorService endpoint(s).", findResponse.Endpoints.Count)