Discovery Find e FindCriteria
Uma operação de localização de descoberta é iniciada por um cliente para descobrir um ou mais serviços e é uma das principais ações na descoberta. Executar uma localização envia uma mensagem 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 WS-Discovery.
DiscoveryClient
A DiscoveryClient classe fornece o mecanismo para executar operações de localização e facilita a execução de operações de cliente de descoberta. Ele contém um Find método, que executa uma localização síncrona (bloqueio) e um FindAsync método, que inicia uma localização assíncrona sem bloqueio. Ambos os métodos usam um FindCriteria parâmetro e fornecem resultados ao usuário por meio de um FindResponse objeto.
FindCriteria
FindCriteria tem 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 a pesquisa deve durar). A FindCriteria pode conter vários critérios de pesquisa. Por padrão, o serviço tem que corresponder a todos os componentes, caso contrário, ele não se considera um serviço correspondente. Se quiser encontrar serviços que correspondam apenas a alguns dos critérios, você pode implementar a lógica de localização personalizada no serviço ou pode 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 pontos de extremidade de serviço correspondentes a TODOS os contratos responderão. Observe que no WCF um ponto de extremidade só pode suportar 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 procurar um subconjunto dos pontos de extremidade. Se mais de um escopo for especificado, somente os pontos de extremidade de serviço correspondentes a TODOS os escopos responderão.
ScopeMatchBy - Especifica o algoritmo de correspondência a ser usado ao combinar os escopos na mensagem de teste com o do ponto de extremidade. Há cinco regras de correspondência de escopo suportadas:
FindCriteria.ScopeMatchByExact faz uma comparação básica de cadeia de caracteres que diferencia maiúsculas de minúsculas.
FindCriteria.ScopeMatchByPrefix correspondências por segmentos separados por "/". Uma pesquisa por
http://contoso/building1
corresponde a um serviço com escopohttp://contoso/building/floor1
. Note que não correspondehttp://contoso/building100
porque os dois últimos segmentos não correspondem.FindCriteria.ScopeMatchByLdap corresponde a escopos por segmentos usando uma URL LDAP.
FindCriteria.ScopeMatchByUuid corresponde aos escopos exatamente 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á usada.
Os critérios de rescisão incluem:
Duration - O tempo máximo de espera pelas respostas dos serviços da rede. A duração padrão é de 20 segundos.
MaxResults - O número máximo de respostas a aguardar. Se MaxResults as respostas forem recebidas antes Duration de decorrido, a operação de localização será encerrada.
FindResponse
FindResponse Tem uma Endpoints propriedade Collection que contém todas as respostas enviadas por serviços correspondentes na rede. Se nenhum serviço respondeu, a coleção estará vazia. Se um ou mais serviços forem respondidos, cada resposta será armazenada em um EndpointDiscoveryMetadata objeto, que contém o endereço, 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)