Condividi tramite


Espansione dei clienti

In un'applicazione chiamante, il livello del modello di servizio è responsabile per tradurre le invocazioni di metodo nel codice applicativo in messaggi in uscita, inviarli ai canali sottostanti, re-interpretare i risultati in valori di ritorno e parametri out nel codice dell'applicazione, e restituire i risultati al chiamante. Le estensioni del modello di servizio modificano o implementano il comportamento di esecuzione o comunicazione e le funzionalità che coinvolgono funzionalità client o dispatcher, comportamenti personalizzati, intercettazione di messaggi e parametri e altre funzionalità di estendibilità.

In questo argomento viene descritto come utilizzare le ClientRuntime classi e ClientOperation in un'applicazione client Windows Communication Foundation (WCF) per modificare il comportamento di esecuzione predefinito di un client WCF o per intercettare o modificare messaggi, parametri o restituire valori prima o successivamente all'invio o al recupero dal livello del canale. Per ulteriori dettagli su come estendere il runtime del servizio, consultare Estendere i dispatcher. Per altre informazioni sui comportamenti che modificano e inseriscono oggetti di personalizzazione nel runtime client, vedere Configurazione ed estensione del runtime con comportamenti.

Clienti

In un client, un oggetto client WCF o un canale client converte le chiamate al metodo in messaggi in uscita e i messaggi in arrivo nei risultati dell'operazione restituiti all'applicazione chiamante. Per altre informazioni sui tipi di client, vedere Architettura client WCF.

I tipi di client WCF hanno tipi di runtime che gestiscono questa funzionalità a livello di endpoint e operazione. Quando un'applicazione chiama un'operazione, ClientOperation converte gli oggetti in uscita in un messaggio, elabora gli intercettori, conferma che la chiamata in uscita è conforme al contratto di destinazione e passa il messaggio in uscita a ClientRuntime, che è responsabile della creazione e della gestione dei canali in uscita (e dei canali in ingresso nel caso di servizi duplex), gestendo l'elaborazione extra dei messaggi in uscita (ad esempio la modifica dell'intestazione), elaborazione degli intercettori di messaggi in entrambe le direzioni e instradamento delle chiamate duplex in ingresso all'oggetto DispatchRuntime del lato client appropriato. Sia che ClientOperationClientRuntime forniscono servizi simili quando i messaggi (inclusi gli errori) vengono restituiti al client.

Queste due classi di runtime sono l'estensione principale per personalizzare l'elaborazione di canali e oggetti client WCF. La ClientRuntime classe consente agli utenti di intercettare ed estendere l'esecuzione del client attraverso tutti i messaggi del contratto. La ClientOperation classe consente agli utenti di intercettare ed estendere l'esecuzione client per tutti i messaggi in una determinata operazione.

La modifica delle proprietà o l'inserimento delle personalizzazioni viene eseguita usando i comportamenti di contratto, endpoint e operazione. Per altre informazioni su come usare questi tipi di comportamenti per eseguire personalizzazioni del runtime client, vedere Configurazione ed estensione del runtime con comportamenti.

Scenari

Esistono diversi motivi per estendere il sistema client, tra cui:

Uso della classe ClientRuntime

La ClientRuntime classe è un punto di estendibilità a cui è possibile aggiungere oggetti di estensione che intercettano i messaggi ed estendono il comportamento del client. Gli oggetti di intercettazione possono elaborare tutti i messaggi in un determinato contratto, elaborare solo i messaggi per determinate operazioni, eseguire l'inizializzazione del canale personalizzato e implementare altri comportamenti dell'applicazione client personalizzata.

  • La proprietà CallbackDispatchRuntime restituisce l'oggetto dispatch runtime per i client di callback avviati dal servizio.

  • La OperationSelector proprietà accetta un oggetto selettore di operazioni personalizzato.

  • La ChannelInitializers proprietà abilita l'aggiunta di un inizializzatore di canale in grado di esaminare o modificare il canale client.

  • La Operations proprietà ottiene una raccolta di ClientOperation oggetti a cui è possibile aggiungere intercettori di messaggi personalizzati che forniscono funzionalità specifiche per i messaggi di tale operazione.

  • La proprietà ManualAddressing consente a un'applicazione di disattivare automaticamente alcune intestazioni di indirizzamento per poter controllare direttamente l'indirizzamento.

  • La Via proprietà imposta il valore della destinazione del messaggio a livello di trasporto per supportare intermediari e altri scenari.

  • La MessageInspectors proprietà ottiene una raccolta di IClientMessageInspector oggetti a cui è possibile aggiungere intercettori di messaggi personalizzati per tutti i messaggi in viaggio attraverso un client WCF.

Inoltre, esistono diverse altre proprietà che recuperano le informazioni sul contratto:

Se il client WCF è un client WCF duplex, le proprietà seguenti recuperano anche le informazioni sul client WCF di callback:

Per estendere l'esecuzione del client WCF in un intero client WCF, esaminare le proprietà disponibili nella ClientRuntime classe per verificare se modificare una proprietà o implementare un'interfaccia e aggiungerla a una proprietà crea la funzionalità che si sta cercando. Dopo aver scelto una particolare estensione da compilare, inserire l'estensione nella proprietà appropriata ClientRuntime implementando un comportamento client che fornisce l'accesso alla ClientRuntime classe quando viene richiamato.

È possibile inserire oggetti di estensione personalizzati in una raccolta usando un comportamento dell'operazione (un oggetto che implementa IOperationBehavior), un comportamento del contratto (un oggetto che implementa IContractBehavior) o un comportamento dell'endpoint (un oggetto che implementa IEndpointBehavior). L'oggetto comportamento di installazione viene aggiunto alla raccolta appropriata di comportamenti a livello di codice( implementando un attributo personalizzato) o implementando un oggetto personalizzato BehaviorExtensionElement per consentire l'inserimento del comportamento tramite un file di configurazione dell'applicazione. Per informazioni dettagliate, vedere Configurazione ed estensione del runtime con comportamenti.

Per esempi che illustrano l'intercettazione in un client WCF, vedere Procedura: Esaminare o modificare messaggi nel client.

Uso della classe ClientOperation

La ClientOperation classe è il percorso per le modifiche del runtime client e il punto di inserimento per le estensioni personalizzate che hanno come ambito una sola operazione del servizio. Per modificare il comportamento di runtime del client per tutti i messaggi in un contratto, usare la ClientRuntime classe .

Utilizzare la Operations proprietà per individuare l'oggetto ClientOperation che rappresenta una determinata operazione del servizio. Le proprietà seguenti consentono di inserire oggetti personalizzati nel sistema client WCF:

Le proprietà seguenti consentono di modificare il sistema in interazione con il formattatore e i controlli dei parametri personalizzati:

  • Utilizzare la SerializeRequest proprietà per controllare la serializzazione di un messaggio in uscita.

  • Utilizzare la DeserializeReply proprietà per controllare la deserializzazione di un messaggio in ingresso.

  • Utilizzare la Action proprietà per controllare l'azione WS-Addressing del messaggio di richiesta.

  • Utilizzare BeginMethod e EndMethod per specificare quali metodi client WCF sono associati a un'operazione asincrona.

  • Utilizzare la FaultContractInfos proprietà per ottenere una raccolta contenente i tipi che possono essere visualizzati in errori SOAP come tipo di dettaglio.

  • Utilizzare le IsInitiating proprietà e IsTerminating per controllare se una sessione viene avviata o se viene interrotta, rispettivamente, quando viene chiamata l'operazione.

  • Utilizzare la IsOneWay proprietà per controllare se l'operazione è un'operazione unidirezionale.

  • Utilizzare la Parent proprietà per ottenere l'oggetto contenitore ClientRuntime .

  • Utilizzare la Name proprietà per ottenere il nome dell'operazione.

  • Usa la SyncMethod proprietà per controllare quale metodo è mappato all'operazione.

Per estendere l'esecuzione del client WCF in un'unica operazione del servizio, esaminare le proprietà disponibili nella ClientOperation classe per verificare se modificare una proprietà o implementare un'interfaccia e aggiungerla a una proprietà crea la funzionalità che si sta cercando. Dopo aver scelto una particolare estensione da compilare, inserire l'estensione nella proprietà appropriata ClientOperation implementando un comportamento client che fornisce l'accesso alla ClientOperation classe quando viene richiamato. All'interno di questo comportamento è quindi possibile modificare la ClientRuntime proprietà in base ai requisiti.

In genere, l'implementazione di un comportamento dell'operazione (un oggetto che implementa l'interfaccia IOperationBehavior) è sufficiente, ma è anche possibile usare il comportamento dell'endpoint e il comportamento del contratto per eseguire la stessa operazione individuando il OperationDescription di una determinata operazione e collegando lì il comportamento. Per informazioni dettagliate, vedere Configurazione ed estensione del runtime con comportamenti.

Per utilizzare il comportamento personalizzato dalla configurazione, installalo utilizzando un gestore della sezione configurazione apposito per il comportamento personalizzato. È anche possibile installare il comportamento creando un attributo personalizzato.

Per esempi che illustrano l'intercettazione in un client WCF, vedere Procedura: Esaminare o modificare i parametri.

Vedere anche