Abbiamo la necessità di implementare un client WCF che sia in grado di effettuare il download automatico dei metadati del servizio remoto e configurare un proxy che sia in grado di stabilire una comunicazione?
Utilizziamo le classi MetadataExchangeClient, MetadataSet, WsdlImporter e ServiceEndpointCollection
creiamo un oggetto MetadataExchangeClient nel quale definiamo la URI del servizio remoto e specifichiamo di voler richiedere il documento WSDL di descrizione del servizio
MetadataExchangeClient metadataExchange = new MetadataExchangeClient
(new Uri("http://localhost:8000/ServizioRemoto/?wsdl"),
MetadataExchangeClientMode.HttpGet);
poi creiamo un oggetto MetadataSet in cui scarichiamo i metadati utilizzando il metodo GetMetadata() della classe MetadataExchangeClient
MetadataSet metadataSet = metadataExchange.GetMetadata();
creiamo un oggetto WsdlImporter dal MetadataSet che contiene il documento WSDL comprensivo degli endpoints
WsdlImporter importer = new WsdlImporter(metadataSet);
e inseriamo gli endpoints nell'apposita collection ServiceEndpointCollection mediante il metodo ImportAllEndpoints() della classe WsdlImporter
ServiceEndpointCollection endpoints = importer.ImportAllEndpoints();
infine, all'interno di un ciclo For..Each configuriamo una variabile proxy per ogni endpoint trovato
foreach (ServiceEndpoint ep in endpoints)
{
IInterfacciaServizio proxy = new ChannelFactory<IInterfacciaServizio>(ep.Binding, ep.Address).CreateChannel();
((IChannel) proxy).Open();
// codice di elaborazione del servizio
((IChannel) proxy).Close();
}
da notare che ChannelFactory è in grado di generare il proxy basandosi in maniera identica a ciò che riflette il contratto del servizio remoto, quindi se un metodo è dichiarato sincrono l'oggetto proxy avrà la stessa identica implementazione del metodo.
Technorati Tag:
WCF ,
.NET3 ,
C#