Búsqueda de detección y FindCriteria

La operación de búsqueda de detección la inicia un cliente para detectar uno o más servicios, y es una de las acciones principales en detección. Al realizar una búsqueda, se envía un mensaje de sondeo de WS-Discovery a través de la red. Los servicios que coinciden con los criterios especificados responden con mensajes ProbeMatch de WS-Discovery. Para obtener más información sobre los mensajes de detección, vea la especificación de WS-Discovery.

DiscoveryClient

La clase DiscoveryClient proporciona el mecanismo para realizar las operaciones de búsqueda y facilita la realización de operaciones del cliente de detección. Contiene un método Find, que realiza una búsqueda sincrónica (con bloqueo), y un método FindAsync, que inicia una búsqueda asincrónica sin bloqueo. Ambos métodos toman un parámetro FindCriteria y proporcionan resultados al usuario a través de un objeto FindResponse.

FindCriteria

FindCriteria tiene varias propiedades, que pueden estar agrupadas en el criterio de búsqueda, que especifica qué servicios está buscando y encuentra criterios de finalización (cuánto tiempo debe durar la búsqueda). Una clase FindCriteria puede contener varios criterios de búsqueda. De forma predeterminada, el servicio tiene que coincidir con todos los componentes; de lo contrario, no se considera un servicio coincidente. Si desea encontrar servicios que solo coinciden con algunos de los criterios, puede implementar la lógica de búsqueda personalizada en el servicio o puede utilizar varias consultas.

Los criterios de búsqueda incluyen:

  • ContractTypeNames (opcional). El nombre del contrato del servicio que se busca y los criterios normalmente utilizados al buscar un servicio. Si se especifica más de un nombre de contrato, solo responderán los extremos del servicio que coincidan con TODOS los contratos. Observe que, en WCF, un extremo solo puede admitir un contrato.

  • Scopes (opcional). Los ámbitos son URI absolutos que se usan para categorizar extremos de servicio individuales. Puede que quiera usar esto en casos en los que varios extremos expongan el mismo contrato y desee averiguar un método para buscar un subconjunto de extremos. Si se especifica más de un ámbito, solo responderán los extremos de servicio que coincidan con TODOS los ámbitos.

  • ScopeMatchBy. Especifica el algoritmo de coincidencia que se va a usar al establecer las coincidencias de los ámbitos del mensaje de sondeo con los del extremo. Hay cinco reglas de coincidencia de ámbito admitidas:

    • ScopeMatchByExact realiza una comparación básica de cadenas con distinción entre mayúsculas y minúsculas.

    • ScopeMatchByPrefix coincide por segmentos separados por "/". Una búsqueda de http://contoso/building1 coincide con un servicio con el ámbito http://contoso/building/floor1. Tenga en cuenta que no coincide con http://contoso/building100 porque los dos últimos segmentos no coinciden.

    • ScopeMatchByLdap coincide con ámbitos por segmentos mediante una dirección LDAP URL.

    • ScopeMatchByUuid coincide con ámbitos que usan una cadena del UUID exactamente.

    • ScopeMatchByNone solo coincide con los servicios que no especifican un ámbito.

    Si no se especifica una regla de coincidencia de ámbito, se usa ScopeMatchByPrefix.

Los criterios de finalización incluyen:

  1. Duration. El tiempo máximo durante el que se esperan respuestas de los servicios de la red. La duración predeterminada es de 20 segundos.

  2. MaxResults. El número máximo de respuestas que se esperan. Si se reciben respuestas MaxResults antes de que haya transcurrido Duration, la operación de búsqueda finaliza.

FindResponse

FindResponse tiene una propiedad de recopilación Endpoints que contiene todas las respuestas enviadas por los servicios coincidentes de la red. Si ningún servicio responde, la recopilación está vacía. Si uno o más servicios respondieran, cada respuesta se almacenaría en un objeto EndpointDiscoveryMetadata, que contiene la dirección, el contrato y cierta información adicional sobre el servicio.

En el siguiente ejemplo, se muestra cómo realizar una operación de búsqueda en código.

// Create DiscoveryClient
DiscoveryClient discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint());

// Create FindCriteria
FindCriteria findCriteria = new FindCriteria(typeof(IPrinterService));
findCriteria.Scopes.Add(new Uri("https://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)

Vea también

Tareas

Ejemplo de detección con ámbitos
Ejemplo de búsqueda asincrónica
Ejemplo básico

Conceptos

Información general de Detección de WCF
Usar el canal del cliente de detección