Architettura client
Le applicazioni usano oggetti client Windows Communication Foundation (WCF) per richiamare le operazioni del servizio. In questo argomento vengono descritti gli oggetti client WCF, i canali client WCF e le relative relazioni con l'architettura del canale sottostante. Per una panoramica di base degli oggetti client WCF, vedere Panoramica sul client WCF. Per altre informazioni sul livello del canale, vedere Estensione del livello del canale.
Panoramica
Il runtime del modello di servizi crea client WCF costituiti dagli elementi seguenti:
Un'implementazione client di un contratto di servizio generata automaticamente, che trasforma le chiamate del codice dell'applicazione in messaggi in uscita e i messaggi di risposta in parametri di output e valori restituiti che possono essere recuperati dall'applicazione.
Un'implementazione di un'interfaccia di controllo (System.ServiceModel.IClientChannel), che raggruppa le varie interfacce e fornisce accesso alle funzionalità di controllo, tra cui la possibilità di chiudere la sessione client ed eliminare il canale.
Un canale client creato in base alle impostazioni di configurazione specificate dall'associazione utilizzata.
Tali client possono essere creati su richiesta dalle applicazioni tramite una classe System.ServiceModel.ChannelFactory oppure creando un'istanza di una classe derivata ClientBase<TChannel> come quella generata dallo strumento ServiceModel Metadata Utility Tool (Svcutil.exe). Queste classi client generate incapsulano e delegano a un'implementazione del canale client che viene costruita dinamicamente da una classe ChannelFactory. Il canale client e la channel factory che le producono costituiscono pertanto il punto centrale d'interesse di questo argomento.
Oggetti client e canali client
L'interfaccia di base dei client WCF è l'interfaccia System.ServiceModel.IClientChannel, che espone la funzionalità client principale, nonché la funzionalità dell'oggetto di comunicazione di base di System.ServiceModel.ICommunicationObject, la funzionalità di contesto di System.ServiceModel.IContextChannel e il comportamento estensibile di System.ServiceModel.IExtensibleObject<T>.
L'interfaccia IClientChannel, tuttavia, non definisce contratti di servizio. Queste vengono dichiarate dall'interfaccia del contratto di servizio (solitamente sono generate dai metadati del servizio usando uno strumento come lo strumento Utilità metadati ServiceModel (Svcutil.exe)). I tipi di client WCF estendono sia IClientChannel sia l'interfaccia del contratto di servizio di destinazione per consentire alle applicazioni di chiamare direttamente le operazioni e avere accesso alla funzionalità di runtime lato client. Con la creazione di un client WCF vengono fornite agli oggetti System.ServiceModel.ChannelFactory di WCF le informazioni necessarie per creare un run-time in grado di connettersi e interagire con l'endpoint del servizio configurato.
Come indicato in precedenza, è necessario configurare i due tipi di client WCF prima di poterli utilizzare. I tipi di client WCF più semplici sono oggetti che derivano da ClientBase<TChannel> (o da DuplexClientBase<TChannel> se il contratto del servizio è un contratto duplex). Per creare questi tipi, è possibile utilizzare un costruttore configurato a livello di codice o un file di configurazione che viene quindi chiamato direttamente per richiamare le operazioni del servizio. Per una panoramica di base degli oggetti ClientBase<TChannel>, vedere Panoramica sul client WCF.
Il secondo tipo di client è quello generato in fase di esecuzione da una chiamata al metodo CreateChannel. Nelle applicazioni interessate a un livello di controllo avanzato sulle informazioni specifiche di comunicazione viene in genere utilizzato questo tipo di client, chiamato oggetto canale client, poiché consente un'interazione più diretta rispetto al sistema di canali e di runtime client sottostante.
Channel factory
La classe responsabile della creazione del run-time sottostante che supporta le chiamate client è la classe System.ServiceModel.ChannelFactory<TChannel>. Gli oggetti client WCF e gli oggetti canale client WCF utilizzano un oggetto ChannelFactory<TChannel> per creare istanze; l'oggetto client derivato ClientBase<TChannel> incapsula la gestione della channel factory, ma per alcuni scenari è possibile utilizzare direttamente la channel factory. Lo scenario più comune si ha quando si desidera creare ripetutamente nuovi canali client da una factory esistente. Se si utilizza un oggetto client, è possibile ottenere la channel factory sottostante da un oggetto client WCF chiamando la proprietà ClientBase<TChannel>.ChannelFactory.
La cosa importante da ricordare a proposito delle channel factory è che creano nuove istanze di canali client per la configurazione fornita loro prima di chiamare il metodo ChannelFactory<TChannel>.CreateChannel. Una volta chiamato il metodo CreateChannel (o ClientBase<TChannel>.Open, ClientBase<TChannel>.CreateChannel oppure qualsiasi operazione su un oggetto client WCF), non è possibile modificare la channel factory e aspettarsi di ottenere canali per istanze del servizio diverse, anche se si modifica soltanto l'indirizzo dell'endpoint di destinazione. Se si desidera creare un oggetto client o un canale client con una configurazione diversa, è necessario prima creare una nuova channel factory.
Per altre informazioni sui vari problemi relativi all'uso di oggetti client WCF e canali client WCF, vedere Accesso ai servizi tramite un client WCF.
Nelle due sezioni seguenti vengono illustrati la creazione e l'utilizzo degli oggetti canale client WCF.
Creazione di un nuovo oggetto canale client WCF
Per illustrare l'utilizzo di un canale client, si supponga che sia stato generato il contratto di servizio seguente.
[System.ServiceModel.ServiceContractAttribute(
Namespace = "http://microsoft.wcf.documentation"
)]
public interface ISampleService
{
[System.ServiceModel.OperationContractAttribute(
Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethod",
ReplyAction = "http://microsoft.wcf.documentation/ISampleService/SampleMethodResponse"
)]
[System.ServiceModel.FaultContractAttribute(
typeof(microsoft.wcf.documentation.SampleFault),
Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethodSampleFaultFault"
)]
string SampleMethod(string msg);
}
Per eseguire la connessione a un servizio ISampleService
, utilizzare direttamente l'interfaccia del contratto generata con una channel factory (ChannelFactory<TChannel>). Una volta creata e configurata una channel factory per un particolare contratto, è possibile chiamare il metodo CreateChannel per restituire oggetti canale client che possono essere utilizzati per comunicare con un servizio ISampleService
.
Quando si usa la classe ChannelFactory<TChannel> con un'interfaccia del contratto del servizio, per aprire, chiudere o interrompere in modo esplicito il canale è necessario eseguire il cast all'interfaccia IClientChannel . Per semplificare l'uso, lo strumento Svcutil.exe genera inoltre un'interfaccia di supporto che implementa l'interfaccia del contratto del servizio e IClientChannel per consentire l'interazione con l'infrastruttura del canale client senza dovere eseguire il cast. Nel codice seguente viene illustrata la definizione di un canale client di supporto che implementa il contratto del servizio precedente.
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public interface ISampleServiceChannel : ISampleService, System.ServiceModel.IClientChannel
{
}
Creazione di un nuovo oggetto canale client WCF
Per utilizzare un canale client per la connessione a un servizio ISampleService
, è necessario utilizzare direttamente l'interfaccia del contratto generata (o la versione di supporto) con una channel factory, passando il tipo dell'interfaccia del contratto come parametro di tipo. Una volta creata e configurata una channel factory per un particolare contratto, è possibile chiamare il metodo ChannelFactory<TChannel>.CreateChannel per restituire oggetti canale client che possono essere utilizzati per comunicare con un servizio ISampleService
.
Quando vengono creati, gli oggetti canale client implementano IClientChannel e l'interfaccia del contratto. È pertanto possibile utilizzarli direttamente per chiamare operazioni che interagiscono con un servizio che supporta tale contratto.
La differenza tra l'utilizzo di oggetti client e di oggetti canale client consiste solo nel maggiore controllo e facilità di utilizzo da parte degli sviluppatori. Coloro che sono abituati a lavorare con le classi e gli oggetti preferiranno utilizzare l'oggetto client WCF anziché il canale client WCF.
Per un esempio, vedere Procedura: Usare ChannelFactory.