Creazione di associazioni definite dall'utente

Esistono diversi modi per creare associazioni non fornite dal sistema:

  • Creare un'associazione personalizzata, basata sulla classe CustomBinding, che è un contenitore riempito con elementi di associazione. L'associazione personalizzata viene quindi aggiunta a un endpoint del servizio. È possibile creare l'associazione personalizzata a livello di programmazione o in un file di configurazione dell'applicazione. Per usare un elemento di associazione da un file di configurazione dell'applicazione, è necessario che l'elemento di associazione estenda BindingElementExtensionElement. Per altre informazioni sui binding personalizzati, vedere Binding personalizzati e CustomBinding.

  • È possibile creare una classe derivata da un'associazione standard. È, ad esempio, possibile derivare una classe da WSHttpBinding ed eseguire l'override del metodo CreateBindingElements per ottenere gli elementi di associazione e inserire un elemento di associazione personalizzato o stabilire un particolare valore per la protezione.

  • È possibile creare un nuovo tipo Binding per controllare completamente l'intera implementazione dell'associazione.

Ordine degli elementi di associazione

Ogni elemento di associazione rappresenta una fase di elaborazione durante l'invio o la ricezione di messaggi. In fase di esecuzione, gli elementi di binding creano i canali e i listener necessari per generare stack di canali in uscita e in ingresso.

Sono disponibili tre tipi di elementi di associazione: elementi di associazione di protocollo, elementi di associazione di codifica ed elementi di associazione del trasporto.

Elementi di associazione di protocollo: rappresentano passaggi di elaborazione di livello superiore che agiscono sui messaggi. I canali e i listener creati da questi elementi di associazione possono aggiungere, rimuovere o modificare il contenuto del messaggio. Una determinata associazione può avere un numero arbitrario di elementi di associazione di protocollo, ognuno dei quali eredita da BindingElement. WCF (Windows Communication Foundation) include diversi elementi di binding del protocollo, tra cui ReliableSessionBindingElement e SymmetricSecurityBindingElement.

Elementi di associazione di codifica: rappresentano trasformazioni tra un messaggio e una codifica pronti per la trasmissione in rete. Le tipiche binding WCF includono esattamente un elemento di binding di codifica. Tra gli esempi di elementi di associazione di codifica sono inclusi MtomMessageEncodingBindingElement, BinaryMessageEncodingBindingElement e TextMessageEncodingBindingElement. Se non viene specificato alcun elemento di associazione di codifica per un'associazione, viene usata la codifica predefinita. L'impostazione predefinita corrisponde a "testo", se il trasporto è HTTP, altrimenti a "binaria".

Elementi di associazione del trasporto: rappresentano la trasmissione di un messaggio di codifica su un protocollo di trasporto. Le tipiche binding WCF includono esattamente un elemento di binding del trasporto, che eredita da TransportBindingElement. Tra gli esempi di elementi di associazione del trasporto sono inclusi TcpTransportBindingElement, HttpTransportBindingElement e NamedPipeTransportBindingElement.

Quando si creano nuove associazioni, l'ordine degli elementi di associazione aggiunti è importante. Aggiungere sempre gli elementi di associazione nell'ordine seguente:

Livello Opzioni Richiesto
Flusso transazioni System.ServiceModel.Channels.TransactionFlowBindingElement No
Affidabilità System.ServiceModel.Channels.ReliableSessionBindingElement No
Sicurezza System.ServiceModel.Channels.SecurityBindingElement No
Duplex composito System.ServiceModel.Channels.CompositeDuplexBindingElement No
Codifica Testo, binario, MTOM, personalizzata Sì*
Trasporto TCP, named pipe, HTTP, HTTPS, MSMQ, personalizzato

Dato che per ogni binding è necessaria una codifica, se non ne viene specificata nessuna, WCF ne aggiunge una predefinita. L'impostazione predefinita è Text/XML per i trasporti HTTP e HTTPS e Binary per gli altri trasporti.

Creazione di un nuovo elemento di associazione

Oltre ai tipi derivati da BindingElement forniti da WCF, è possibile creare propri elementi di binding. Questo consente di personalizzare la modalità di creazione dello stack di associazioni e di specificare i componenti in esso inclusi creando un proprio BindingElement che può essere composto con gli altri tipi forniti dal sistema nello stack.

Ad esempio, se si implementa un LoggingBindingElement che offre la possibilità di registrare il messaggio in un database, è necessario posizionare tale elemento sopra un canale di trasporto nello stack di canali. In questo caso, l'applicazione crea un'associazione personalizzata che compone LoggingBindingElement con TcpTransportBindingElement, come nell'esempio seguente.

Binding customBinding = new CustomBinding(  
  new LoggingBindingElement(),
  new TcpTransportBindingElement()  
);  

La modalità di scrittura del nuovo elemento di associazione dipende dalla funzionalità esatta. Uno degli esempi, Trasporto: UDP, fornisce una descrizione dettagliata di come implementare un tipo di elemento di binding.

Creazione di una nuova associazione

Un elemento di associazione creato dall'utente può essere usato in due modi. Nella sezione precedente è stato illustrato il primo modo, ovvero tramite un'associazione personalizzata. Un'associazione personalizzata consente all'utente di creare una propria associazione basata su un set arbitrario di elementi di associazione, inclusi quelli creati dall'utente.

Se si usa l'associazione in più di un'applicazione, creare la propria associazione ed estendere Binding. Questo evita di creare manualmente un'associazione personalizzata ogni volta che si desidera usarla. Un'associazione definita dall'utente consente di definire il comportamento dell'associazione e includere elementi di associazione definiti dall'utente. Inoltre è preconfezionata, ovvero non costringe a ricreare il binding ogni volta che la si usa.

Un'associazione definita dall'utente deve implementare almeno il metodo CreateBindingElements e la proprietà Scheme.

Il metodo CreateBindingElements restituisce una nuova classe BindingElementCollection contenente gli elementi di associazione per l'associazione. La raccolta è ordinata e deve contenere prima gli elementi di associazione di protocollo, seguiti dall'elemento di associazione di codifica, seguito dall'elemento di associazione del trasporto. Quando si usano elementi di binding forniti dal sistema WCF, è necessario seguire le regole di ordinamento degli elementi di binding specificate in Binding personalizzati. Questa raccolta non deve mai fare riferimento a oggetti a cui si fa riferimento nella classe di associazioni definite dall'utente; gli autori delle associazioni devono pertanto restituire un Clone() di BindingElementCollection in ogni chiamata a CreateBindingElements.

La proprietà Scheme rappresenta lo schema URI del protocollo di trasporto in uso nell'associazione. Ad esempio, WSHttpBinding e NetTcpBinding restituiscono "http" e "net.tcp" dalle rispettive proprietà Scheme.

Per un elenco completo delle proprietà e dei metodi facoltativi per le associazioni definite dall'utente, vedere Binding.

Esempio

In questo esempio viene implementata un'associazione di profilo in SampleProfileUdpBinding, che deriva da Binding. SampleProfileUdpBinding contiene fino a quattro elementi di binding: uno creato dall'utente (UdpTransportBindingElement) e tre forniti dal sistema: TextMessageEncodingBindingElement, CompositeDuplexBindingElement e ReliableSessionBindingElement.

public override BindingElementCollection CreateBindingElements()  
{
    BindingElementCollection bindingElements = new BindingElementCollection();  
    if (ReliableSessionEnabled)  
    {  
        bindingElements.Add(session);  
        bindingElements.Add(compositeDuplex);  
    }  
    bindingElements.Add(encoding);  
    bindingElements.Add(transport);  
    return bindingElements.Clone();  
}  

Restrizioni di sicurezza con i contratti duplex

Non tutti gli elementi di associazione sono reciprocamente compatibili. In particolare, esistono alcune restrizioni sugli elementi di associazione di sicurezza, se usati con contratti duplex.

Protezione monofase

È possibile implementare la sicurezza "monofase", in cui tutte le credenziali di sicurezza necessarie vengono inviate in un singolo messaggio, impostando l'attributo negotiateServiceCredential dell'elemento di configurazione <message> su false.

L'autenticazione monofase non funziona con i contratti duplex.

Per i contratti request/reply, l'autenticazione monofase funziona solo se lo stack di associazioni sotto l'elemento di associazione di sicurezza supporta la creazione di istanze di IRequestChannel o IRequestSessionChannel.

Per i contratti unidirezionali, l'autenticazione monofase funziona se lo stack di associazioni sotto l'elemento di associazione di sicurezza supporta la creazione di istanze di IRequestChannel, IRequestSessionChannel, IOutputChannel o IOutputSessionChannel.

I token del contesto di sicurezza in modalità cookie non possono essere usati con contratti duplex.

Per i contratti request/reply, i token del contesto di sicurezza in modalità cookie funzionano solo se lo stack di associazioni sotto l'elemento di associazione di sicurezza supporta la creazione di istanze di IRequestChannel o IRequestSessionChannel.

Per i contratti unidirezionali, i token del contesto di sicurezza in modalità cookie funzionano se lo stack di associazioni sotto l'elemento di associazione di sicurezza supporta la creazione di istanze di IRequestChannel o IRequestSessionChannel.

Token del contesto di sicurezza in modalità sessione

I token del contesto di sicurezza (SCT) in modalità sessione funzionano per i contratti duplex se lo stack di associazioni sotto l'elemento di associazione di sicurezza supporta la creazione di istanze di IDuplexChannel o IDuplexSessionChannel.

I token del contesto di sicurezza (SCT) in modalità sessione funzionano per i contratti request/reply se lo stack di associazioni sotto l'elemento di associazione di sicurezza supporta la creazione di istanze di IDuplexChannel, IDuplexSessionChannel, IRequestChannel o IRequestSessionChannel.

I token del contesto di sicurezza (SCT) in modalità sessione funzionano per i contratti unidirezionali se lo stack di associazioni sotto l'elemento di associazione di sicurezza supporta la creazione di istanze di IDuplexChannel, IDuplexSessionChannel, IRequestChannel o IRequestSessionChannel.

Derivazione da un'associazione standard

Invece di creare una classe di associazioni completamente nuova, è possibile estendere una delle associazioni fornite dal sistema esistenti. Analogamente al caso precedente, è necessario eseguire l'override del metodo CreateBindingElements e della proprietà Scheme.

Vedi anche