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.