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:
FindCriteria.ScopeMatchByExact faz uma comparação básica de cadeia de cadeia de caracteres com distinção entre maiúsculas e minúsculas.
FindCriteria.ScopeMatchByPrefix corresponde por segmentos separados por "/". Uma pesquisa por
http://contoso/building1
corresponde a um serviço com escopohttp://contoso/building/floor1
. Observe que não corresponde ahttp://contoso/building100
porque os dois últimos segmentos não correspondem.FindCriteria.ScopeMatchByLdap corresponde aos escopos por segmentos usando um URL LDAP.
FindCriteria.ScopeMatchByUuid corresponde exatamente aos escopos usando uma cadeia de caracteres UUID.
FindCriteria.ScopeMatchByNone corresponde apenas aos serviços que não especificam um escopo.
Se uma regra de correspondência de escopo não for especificada, ScopeMatchByPrefix será usado.
Os critérios de rescisão incluem:
Duration - O tempo máximo de espera por respostas de serviços na rede. A duração padrão é de 20 segundos.
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)