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 utilizzare un elemento di associazione da un file di configurazione dell'applicazione, è necessario che l'elemento di associazione estenda BindingElementExtensionElement. Per ulteriori informazioni su sulla associazioni personalizzate, vedere Associazioni personalizzate 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 associazione 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, di cui ognuno eredita da BindingElement. Windows Communication Foundation (WCF) include diversi elementi di associazione di 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 associazioni WCF includono esattamente un elemento di associazione 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 utilizzata 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 associazioni WCF includono esattamente un elemento di associazione 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 | Obbligatorio |
---|---|---|
Flusso transazioni |
No |
|
Affidabilità |
System.ServiceModel.Channels.ReliableSessionBindingElement |
No |
Sicurezza |
No |
|
Duplex composito |
No |
|
Codifica |
Testo, binario, MTOM, personalizzato |
Sì* |
Trasporto |
TCP, named pipe, HTTP, HTTPS, MSMQ, personalizzato |
Sì |
*Dato che per ogni associazione è necessaria una codifica, se non viene specificata alcuna codifica, WCF ne aggiunge automaticamente 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 associazione. 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 associazione.
Creazione di una nuova associazione
Un elemento di associazione creato dall'utente può essere utilizzato 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 utilizza 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 utilizzarla. 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 l'associazione ogni volta che la si utilizza.
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 utilizzano elementi di associazione forniti dal sistema WCF, è necessario seguire le regole di ordinamento degli elementi di associazione specificate in Associazioni personalizzate. 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 associazione: 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 utilizzati con contratti duplex.
Protezione monofase
È possibile implementare la protezione "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.
Token del contesto di sicurezza in modalità cookie
I token del contesto di sicurezza in modalità cookie non possono essere utilizzati 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.