Condividi tramite


Ricerca di individuazione e FindCriteria

Un'operazione di ricerca dell'individuazione viene inizializzata da un client per individuare uno o più servizi ed è una delle azioni principali nell'ambito dell'individuazione. L'esecuzione di una ricerca invia un messaggio WS-Discovery Probe sulla rete. I servizi che corrispondono ai criteri specificati inviano una risposta con i messaggi WS-Discovery ProbeMatch. Per altre informazioni sui messaggi di individuazione, vedere la specifica WS-Discovery.

DiscoveryClient

La classe DiscoveryClient fornisce il meccanismo necessario per eseguire operazioni di ricerca e agevola l'esecuzione delle operazioni del client di individuazione. Contiene un metodo Find che esegue una ricerca sincrona (bloccante) scoperta e un metodo FindAsync che viene inizializzato con una ricerca asincrona non bloccante. Entrambi i metodi utilizzano un parametro FindCriteria e forniscono risultati all'utente tramite un oggetto FindResponse.

FindCriteria

FindCriteria dispone di varie proprietà, raggruppabili in criteri di ricerca, che specificano i servizi ricercati e cercano criteri di terminazione (durata della ricerca). Un elemento FindCriteria può contenere più criteri di ricerca. Per impostazione predefinita, il servizio deve individuare corrispondenze per tutti i componenti. In caso contrario, non viene considerato un servizio corrispondente. Se si desidera cercare servizi che corrispondono solo a determinati criteri, è possibile implementare la logica di ricerca personalizzata nel servizio oppure utilizzare più query.

I criteri di ricerca includono:

  • ContractTypeNameElement - Facoltativo. Nome del contratto del servizio cercato e criteri in genere utilizzati in fase di ricerca di un servizio. Se viene specificato più di un nome di contratto, verrà inviata una risposta solo dagli endpoint del servizio corrispondenti a TUTTI i contratti. Si noti che in WCF un endpoint può supportare un solo contratto.

  • ScopeElement - Facoltativo. Gli ambiti sono URI assoluti utilizzati per suddividere in categorie singoli endpoint servizio. Potrebbe risultare opportuno utilizzare questo ambito negli scenari in cui più endpoint espongono lo stesso contratto e si desidera un metodo di ricerca di un subset degli endpoint. Se viene specificato più di un ambito, verrà inviata una risposta solo dagli endpoint del servizio corrispondenti a TUTTI gli ambiti.

  • ScopeMatchBy - Specifica l'algoritmo di corrispondenza da utilizzare per individuare la corrispondenza tra l'ambito nel messaggio del Probe e quello dell'endpoint. Sono supportate cinque regole di corrispondenza degli ambiti:

    • FindCriteria.ScopeMatchByExact esegue un confronto di base tra le stringhe con distinzione tra maiuscole e minuscole.

    • FindCriteria.ScopeMatchByPrefix individua la corrispondenza in base a segmenti separati da "/". Una ricerca per http://contoso/building1 corrisponde a un servizio con ambito http://contoso/building/floor1. Si noti che non corrisponde a http://contoso/building100 perché gli ultimi due segmenti non corrispondono.

    • FindCriteria.ScopeMatchByLdap individua la corrispondenza degli ambiti in base ai segmenti utilizzando un URL LDAP.

    • FindCriteria.ScopeMatchByUuid individua la corrispondenza esatta degli ambiti utilizzando una stringa UUID.

    • FindCriteria.ScopeMatchByNone individua la corrispondenza con i soli servizi che non specificano un ambito.

    Se non si specifica una regola di corrispondenza degli ambiti, verrà utilizzato ScopeMatchByPrefix.

I criteri di terminazione includono:

  1. Duration - Tempo massimo di attesa di risposte dai servizi in una rete. La durata predefinita è 20 secondi.

  2. MaxResults - Numero massimo di risposte da attendere. Se le risposte MaxResults vengono ricevute prima della scadenza specificata dalla proprietà Duration, l'operazione di ricerca termina.

FindResponse

FindResponse dispone di una proprietà della raccolta Endpoints che contiene qualsiasi replica inviata da servizi corrispondenti sulla rete. Se nessun servizio invia una risposta, la raccolta è vuota. Se uno o più servizi inviano una risposta, ogni replica viene archiviata in un oggetto EndpointDiscoveryMetadata che contiene l'indirizzo, il contratto e alcune informazioni aggiuntive sul servizio.

Nell'esempio seguente viene mostrato come eseguire un'operazione di ricerca nel codice.

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

Vedi anche