Condividi tramite


Modello a oggetti WCF Discovery

WCF Discovery è costituito da un set di tipi che forniscono un modello di programmazione unificato che consente di scrivere servizi individuabili in fase di esecuzione e client in grado di trovare e utilizzare tali servizi.

Come rendere individuabile un servizio e trovare i servizi

Per rendere individuabile un servizio WCF, aggiungere un elemento ServiceDiscoveryBehavior all'oggetto ServiceDescription dell'host del servizio e aggiungere un endpoint di individuazione. Se un servizio è configurato per inviare messaggi di annuncio (con AnnouncementEndpoint), l'annuncio viene inviato quando l'host del servizio viene aperto e chiuso.

Per essere in ascolto dei messaggi di annuncio del servizio, un client ospita un servizio annunci e aggiunge uno o più endpoint annunci. Il servizio annunci riceve i messaggi di annuncio e genera eventi di annuncio.

Il client utilizza la classe DiscoveryClient per cercare i servizi disponibili. L'applicazione client crea un'istanza della classe DiscoveryClient, passando un endpoint di individuazione che specifica dove inviare i messaggi di individuazione. Il client chiama il metodo Find che invia una richiesta Probe. I servizi in ascolto dei messaggi di individuazione ricevono la richiesta Probe. Se il servizio corrisponde ai criteri specificati in Probe, al client viene restituito il messaggio ProbeMatch.

Modello a oggetti

L'API di WCF Discovery definisce le classi seguenti:

AnnouncementClient

La classe AnnouncementClient include metodi sincroni e asincroni per l'invio di messaggi di annuncio. Esistono due tipi di messaggi di annuncio, Hello e Bye. Il messaggio Hello viene inviato per indicare che un servizio è diventato disponibile, mentre il messaggio Bye viene inviato per indicare che un servizio esistente non è più disponibile. Lo sviluppatore crea un'istanza di AnnouncementClient, passando un'istanza di AnnouncementEndpoint come parametro costruttore.

AnnouncementEndpoint

AnnouncementEndpoint rappresenta un endpoint standard con un contratto annuncio fisso. È utilizzato da un servizio o da un client per inviare e ricevere messaggi di annuncio. Per impostazione predefinita, la classe AnnouncementEndpoint è impostata per utilizzare la versione del protocollo WS_Discovery 11.

AnnouncementService

AnnouncementService è un'implementazione fornita dal sistema di un servizio annunci che riceve ed elabora messaggi di annuncio. Quando viene ricevuto un messaggio Hello o Bye, l'istanza di AnnouncementService chiama il metodo virtuale appropriato OnBeginOnlineAnnouncement o OnBeginOfflineAnnouncement, il quale genera un evento di annuncio.

DiscoveryClient

La classe DiscoveryClient viene utilizzata da un'applicazione client per trovare e risolvere i servizi disponibili. Fornisce metodi sincroni e asincroni per individuare e risolvere i servizi rispettivamente in base agli elementi FindCriteria e ResolveCriteria specificati. Lo sviluppatore crea un'istanza di DiscoveryClient e fornisce un'istanza di DiscoveryEndpoint come parametro costruttore.

Per trovare un servizio, lo sviluppatore richiama il metodo Find sincrono o asincrono che fornisce un'istanza di FindCriteria che contiene i criteri di ricerca da utilizzare. DiscoveryClient crea un messaggio Probe con le intestazioni appropriate ed invia la richiesta di individuazione. Poiché possono essere presenti più richieste Find in attesa in un determinato momento, il client correla le risposte ricevute e convalida la risposta. Recapita quindi i risultati al chiamante dell'operazione Find utilizzando FindResponse.

Per risolvere un servizio noto, lo sviluppatore richiama il metodo Resolve sincrono o asincrono che fornisce un'istanza di ResolveCriteria contenente l'elemento EndpointAddress del servizio noto. DiscoveryClient crea il messaggio Resolve con le intestazioni appropriate ed invia la richiesta di risoluzione. La risposta ricevuta viene correlata rispetto alle richieste di risoluzione in attesa ed il risultato viene recapitato al chiamante dell'operazione Resolve utilizzando ResolveResponse.

Se in rete è presente un proxy di individuazione e DiscoveryClient invia la richiesta di individuazione in modo multicast, il proxy di individuazione può rispondere con il messaggio Hello di eliminazione multicast. DiscoveryClient genera l'evento ProxyAvailable quando riceve messaggi Hello in risposta alle richieste Find o Resolve in attesa. L'evento ProxyAvailable contiene i dati EndpointDiscoveryMetadata relativi al proxy di individuazione. A seconda delle esigenze, lo sviluppatore può decidere se utilizzare queste informazioni per passare dalla modalità ad hoc a quella gestita.

DiscoveryEndpoint

DiscoveryEndpoint rappresenta un endpoint standard con un contratto di individuazione fisso. È utilizzato da un servizio o da un client per inviare o ricevere messaggi di individuazione. Per impostazione predefinita, DiscoveryEndpoint è impostato per utilizzare la modalità ServiceDiscoveryMode.Managed e la versione del protocollo WS_Discovery 11.

DiscoveryMessageSequenceGenerator

DiscoveryMessageSequenceGenerator è utilizzato per generare un oggetto DiscoveryMessageSequence quando il servizio invia messaggi di individuazione o di annuncio.

DiscoveryService

La classe astratta DiscoveryService offre un framework per ricevere ed elaborare messaggi Probe e Resolve. Quando viene ricevuto un messaggio Probe, DiscoveryService crea un'istanza di FindRequestContext in base al messaggio in ingresso e richiama il metodo virtuale OnBeginFind. Quando viene ricevuto un messaggio Resolve, DiscoveryService richiama il metodo virtuale OnBeginResolve. È possibile ereditare da questa classe per fornire un'implementazione personalizzata del servizio di individuazione.

DiscoveryProxy

La classe astratta DiscoveryProxy offre un framework per ricevere ed elaborare messaggi di individuazione e di annuncio. È possibile ereditare da questa classe quando si implementa un proxy di individuazione personalizzato. Quando un messaggio Probe viene ricevuto tramite multicast, la classe DiscoveryProxy chiama il metodo virtuale BeginShouldRedirectFind per determinare se deve essere inviato un messaggio di eliminazione multicast. Se lo sviluppatore decide di non inviare un messaggio di eliminazione multicast o se il messaggio Probe è ricevuto tramite unicast, crea un'istanza della classe FindRequestContext basata sul messaggio in arrivo e richiama il metodo virtuale OnBeginFind. Quando un messaggio Resolve viene ricevuto tramite multicast, la classe DiscoveryProxy chiama il metodo virtuale ShouldRedirectResolve per determinare se deve essere inviato un messaggio di eliminazione multicast. Se lo sviluppatore decide di non inviare un messaggio di eliminazione multicast o se il messaggio Resolve è ricevuto tramite unicast, crea un'istanza della classe ResolveCriteria basata sul messaggio in arrivo e richiama il metodo virtuale OnBeginResolve. Quando viene ricevuto un messaggio Hello o Bye, DiscoveryProxy chiama il metodo virtuale appropriato (OnBeginOnlineAnnouncement o OnBeingOfflineAnnouncement), il quale genera un evento di annuncio.

DiscoveryVersion

La classe DiscoveryVersion rappresenta la versione del protocollo di individuazione da utilizzare.

EndpointDiscoveryBehavior

La classe EndpointDiscoveryBehavior è utilizzata per controllare l'individuabilità di un endpoint, specificare le estensioni, i nomi dei tipi di contratto aggiuntivi e gli ambiti associati all'endpoint. Questo comportamento viene aggiunto a un endpoint applicazione per configurare i relativi dati di EndpointDiscoveryMetadata. Quando ServiceDiscoveryBehavior viene aggiunto all'host del servizio, tutti gli endpoint applicazione ospitati dall'host del servizio diventano individuabili per impostazione predefinita. Lo sviluppatore può disabilitare l'individuazione per uno specifico endpoint impostando la proprietà Enabled su false.

EndpointDiscoveryMetadata

La classe EndpointDiscoveryMetadata fornisce una rappresentazione indipendente dalla versione di un endpoint pubblicato dal servizio. Contiene indirizzi endpoint, URI di ascolto, nomi di tipo di contratto, ambiti, versione dei metadati ed estensioni specificati dallo sviluppatore del servizio. L'oggetto FindCriteria inviato dal client durante un'operazione Probe viene confrontato con EndpointDiscoveryMetadata. Se i criteri corrispondono, al client viene restituito EndpointDiscoveryMetadata. L'indirizzo dell'endpoint in ResolveCriteria viene confrontato con l'indirizzo dell'endpoint di EndpointDiscoveryMetadata. Se i criteri corrispondono, al client viene restituito EndpointDiscoveryMetadata.

FindCriteria

La classe FindCriteria è una classe indipendente dalla versione utilizzata per specificare i criteri utilizzati per trovare un servizio. Supporta completamente i criteri definiti da WS-Discovery per individuare le corrispondenze con i servizi. Dispone inoltre di estensioni che gli sviluppatori possono specificare valori personalizzati utilizzabili durante il processo di individuazione delle corrispondenze. Lo sviluppatore può specificare i criteri di chiusura per l'operazione Find impostando MaxResults, che specifica il numero complessivo di servizi che lo sviluppatore cerca oppure Duration, ovvero il valore che indica la durata dell'attesa delle risposte nel client.

FindRequestContext

L'istanza della classe FindRequestContext viene creata dal servizio di individuazione in base al messaggio Probe ricevuto quando un client avvia l'operazione Find. Contiene un'istanza di FindCriteria specificata dal client.

FindResponse

La classe FindResponse viene restituita al chiamante di Find con le risposte dell'operazione Find. È inoltre presente in FindCompletedEventArgs. Contiene una raccolta di EndpointDiscoveryMetadata, ovvero la raccolta degli endpoint individuati e un dizionario di EndpointDiscoveryMetadata e DiscoveryMessageSequence.

ResolveCriteria

La classe ResolveCriteria è indipendente dalla versione e viene utilizzata per specificare i criteri utilizzati per la risoluzione di un servizio già noto. Contiene l'indirizzo dell'endpoint del servizio noto. Lo sviluppatore può specificare i criteri di chiusura per l'operazione di risoluzione impostando Duration, che indica la durata dell'attesa delle risposte da parte del client.

ResolveResponse

La classe ResolveResponse viene restituita al chiamante del metodo Resolve con la risposta dell'operazione Resolve. È inoltre presente in ResolveCompletedEventArgs. Contiene un'istanza di EndpointDiscoveryMetadata, ovvero degli endpoint individuati e un'istanza di DiscoveryMessageSequence.

ServiceDiscoveryBehavior

La classe ServiceDiscoveryBehavior consente allo sviluppatore di aggiungere la funzionalità di individuazione a un servizio. Questo comportamento viene aggiunto a ServiceHost. La classe ServiceDiscoveryBehavior esegue iterazioni sugli endpoint applicazione aggiunti all'host del servizio e crea una raccolta di EndpointDiscoveryMetadata dagli endpoint individuabili. Tutti gli endpoint sono individuabili per impostazione predefinita. L'individuabilità di un determinato endpoint può essere controllata aggiungendo EndpointDiscoveryBehavior a un determinato endpoint. Se gli endpoint annunci vengono aggiunti a ServiceDiscoveryBehavior, l'annuncio di tutti gli endpoint individuabili viene inviato tramite ognuno degli endpoint annunci quando l'host del servizio è aperto o chiuso.

UdpAnnouncementEndpoint

La classe UdpAnnouncementEndpoint è un endpoint annuncio standard preconfigurato per l'annuncio tramite un'associazione multicast UDP. Per impostazione predefinita, UdpAnnouncementEndpoint viene impostato per utilizzare la versione WSApril2005 di WS_Discovery.

UdpDiscoveryEndpoint

La classe UdpDiscoveryEndpoint è un endpoint di individuazione standard preconfigurata per l'individuazione tramite l'associazione multicast UDP. Per impostazione predefinita, DiscoveryEndpoint è impostato per utilizzare la versione WSDiscovery11 di WS-Discovery e la modalità ServiceDiscoveryMode.Adhoc.