Compartilhar via


FindCriteria e descoberta achada

Uma operação de descoberta de localização é iniciada por um cliente para descobrir um ou mais serviços e é uma das principais ações na descoberta. A execução de uma localização envia uma mensagem do WS-Discovery Probe pela rede. Os serviços que correspondem aos critérios especificados respondem com mensagens WS-Discovery ProbeMatch. Para obter mais informações sobre mensagens de descoberta, consulte a especificação de descoberta de WS.

DiscoveryClient

A classe DiscoveryClient fornece o mecanismo para realizar operações de localização e facilita a execução de operações do cliente de descoberta. Ele contém um método Find, que executa uma localização síncrona (bloqueadora), e um método FindAsync, que inicia uma localização assíncrona sem bloqueio. Ambos os métodos usam um parâmetro FindCriteria e fornecem resultados ao usuário por meio de um objeto FindResponse.

FindCriteria

FindCriteria possui várias propriedades, que podem ser agrupadas em critérios de pesquisa, que especificam quais serviços você está procurando e encontram critérios de rescisão (quanto tempo deve durar a pesquisa). Um FindCriteria pode conter vários critérios de pesquisa. Por padrão, o serviço deve corresponder a todos os componentes, caso contrário, ele não se considera um serviço correspondente. Se você quiser encontrar serviços que correspondam apenas a alguns dos critérios, poderá implementar a lógica de localização personalizada no serviço ou usar várias consultas.

Os critérios de pesquisa incluem:

  • ContractTypeNameElement – Opcional. O nome do contrato do serviço que está sendo pesquisado e os critérios normalmente usados ao pesquisar um serviço. Se mais de um nome de contrato for especificado, somente os terminais de serviço correspondentes a TODOS os contratos responderão. Observe que no WCF um ponto de extremidade só pode dar suporte a um contrato.

  • ScopeElement – Opcional. Os escopos são URIs absolutos usados para categorizar pontos de extremidade de serviço individuais. Você pode querer usar isso em cenários em que vários pontos de extremidade expõem o mesmo contrato e você deseja uma maneira de pesquisar um subconjunto de pontos de extremidade. Se mais de um escopo for especificado, somente os terminais de serviço correspondentes a TODOS os escopos responderão.

  • ScopeMatchBy - Especifica o algoritmo de correspondência a ser usado durante a correspondência dos escopos na mensagem de investigação com o do ponto de extremidade. Há cinco regras de correspondência de escopo compatíveis:

    Se uma regra de correspondência de escopo não for especificada, ScopeMatchByPrefix será usado.

Os critérios de rescisão incluem:

  1. Duration - O tempo máximo de espera por respostas de serviços na rede. A duração padrão é de 20 segundos.

  2. MaxResults - O número máximo de respostas a serem aguardadas. Se MaxResults respostas forem recebidas antes que Duration tenha decorrido, a operação de localização termina.

FindResponse

FindResponse tem uma propriedade de coleção Endpoints que contém todas as respostas enviadas por serviços correspondentes na rede. Se nenhum serviço for respondido, a coleção esta vazia. Se um ou mais serviços responderam, cada resposta será armazenada em um objeto EndpointDiscoveryMetadata, que contém o endereço, contrato e algumas informações adicionais sobre o serviço.

O exemplo a seguir mostra como executar uma operação de localização no código.

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

Confira também