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 ulteriori informazioni su messaggi di individuazione, vedere il documento relativo alla 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:
ContractTypeNames - 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. In WCF un endpoint può supportare un solo contratto.
Scopes - 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:
ScopeMatchByExact esegue un confronto di base tra le stringhe con distinzione tra maiuscole e minuscole.
ScopeMatchByPrefix individua la corrispondenza in base a segmenti separati da "/". Una ricerca di http://contoso/building1 corrisponde a un servizio con ambito http://contoso/building/floor1. Non corrisponde a http://contoso/building100, perché gli ultimi due segmenti non corrispondono.
ScopeMatchByLdap individua la corrispondenza degli ambiti in base ai segmenti utilizzando un URL LDAP.
ScopeMatchByUuid individua la corrispondenza esatta degli ambiti utilizzando una stringa UUID.
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:
Duration - Tempo massimo di attesa di risposte dai servizi in una rete. La durata predefinita è 20 secondi.
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("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)
Vedere anche
Attività
Esempio relativo all'individuazione di ambiti
Esempio di ricerca asincrona
Esempio di base
Concetti
Panoramica di WCF Discovery
Utilizzo del canale client di individuazione