Condividi tramite


Architettura client

Per richiamare operazioni del servizio, le applicazioni utilizzano oggetti client Windows Communication Foundation (WCF). 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 sugli oggetti client WCF, vedere Panoramica dei client WCF. Per ulteriori informazioni su 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 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.

L'interfaccia IClientChannel, tuttavia, non definisce contratti di servizio. Questi vengono dichiarati dall'interfaccia del contratto del servizio (solitamente generata da metadati del servizio utilizzando un strumento come lo Strumento ServiceModel Metadata Utility Tool (Svcutil.exe)). I tipi di client WCF estendono sia l'interfaccia IClientChannel sia l'interfaccia del contratto del servizio di destinazione per consentire alle applicazioni di chiamare direttamente le operazioni e avere accesso alla funzionalità di run-time lato client. Con la creazione di un client WCF vengono fornite agli oggetti della classe WCFSystem.ServiceModel.ChannelFactory 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 (o da DuplexClientBase 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 sugli oggetti della classe ClientBase, vedere Panoramica dei 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. Gli oggetti client WCF e gli oggetti canale client WCF utilizzano un oggetto ChannelFactory per creare istanze; l'oggetto client derivato ClientBase 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à System.ServiceModel.ClientBase.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 System.ServiceModel.ChannelFactory.CreateChannel. Una volta chiamato il metodo CreateChannel (o System.ServiceModel.ClientBase.Open, System.ServiceModel.ClientBase.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 ulteriori informazioni su su vari problemi derivanti dall'utilizzo di oggetti client WCF e canali client WCF, vedere Accesso ai servizi tramite client.

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). 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 utilizza la classe ChannelFactory 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'utilizzo, 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 System.ServiceModel.ChannelFactory.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: utilizzare ChannelFactory.