Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Esistono diversi modi per creare associazioni non fornite dal sistema:
Creare un'associazione personalizzata, in base alla classe CustomBinding, che è un contenitore che si riempie di elementi di associazione. Il binding personalizzato viene quindi aggiunto a un endpoint del servizio. È possibile creare l'associazione personalizzata a livello di codice o in un file di configurazione dell'applicazione. Per usare un elemento di associazione da un file di configurazione dell'applicazione, l'elemento di associazione deve estendere BindingElementExtensionElement. Per altre informazioni sulle associazioni personalizzate, vedere Associazioni personalizzate e CustomBinding.
È possibile creare una classe che deriva da un'associazione standard. Ad esempio, è possibile derivare una classe da WSHttpBinding e eseguire l'override CreateBindingElements del metodo per ottenere gli elementi di associazione e inserire un elemento di associazione personalizzato o stabilire un valore specifico per la sicurezza.
È possibile creare un nuovo Binding tipo per controllare completamente l'intera implementazione dell'associazione.
Ordine degli elementi di associazione
Ogni elemento di associazione rappresenta un passaggio 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 creare stack di canali in uscita e in ingresso.
Esistono tre tipi principali di elementi di associazione: elementi di associazione del protocollo, elementi di associazione di codifica ed elementi di associazione del trasporto.
Elementi di associazione del protocollo: questi elementi rappresentano passaggi di elaborazione di livello superiore che agiscono sui messaggi. Canali e 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 del protocollo, ognuno dei quali eredita da BindingElement. Windows Communication Foundation (WCF) include diversi elementi di associazione di protocollo, tra cui ReliableSessionBindingElement e SymmetricSecurityBindingElement.
Elemento di associazione di codifica: questi elementi rappresentano trasformazioni tra un messaggio e una codifica pronta per la trasmissione in rete. Le associazioni WCF tipiche includono esattamente un elemento di associazione di codifica. Esempi di elementi di associazione di codifica includono MtomMessageEncodingBindingElement, BinaryMessageEncodingBindingElemente TextMessageEncodingBindingElement. Se non viene specificato un elemento di associazione di codifica per un'associazione, viene utilizzata una codifica predefinita. Il valore predefinito è il testo quando il trasporto è HTTP e binario in caso contrario.
Elemento di associazione trasporto: questi elementi rappresentano la trasmissione di un messaggio di codifica in un protocollo di trasporto. Le associazioni WCF tipiche includono esattamente un elemento di associazione di trasporto, che eredita da TransportBindingElement. Esempi di elementi di associazione del trasporto includono TcpTransportBindingElement, HttpTransportBindingElemente NamedPipeTransportBindingElement.
Quando si creano nuove associazioni, l'ordine degli elementi di associazione aggiunti è importante. Aggiungere sempre elementi di associazione nell'ordine seguente:
| Strato | Opzioni | Obbligatorio |
|---|---|---|
| Flusso delle 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, Personalizzato | Sì* |
| Trasporto | TCP, Named Pipes, HTTP, HTTPS, MSMQ, Personalizzato | Sì |
*Poiché per ogni associazione è necessaria una codifica, se non è specificata una codifica, WCF aggiunge automaticamente una codifica predefinita. Il valore predefinito è Text/XML per i trasporti HTTP e HTTPS e Binary in caso contrario.
Creazione di un nuovo elemento di associazione
Oltre ai tipi derivati da BindingElement forniti da WCF, è possibile creare elementi di associazione personalizzati. In questo modo è possibile personalizzare il modo in cui viene creato lo stack di associazioni e i componenti che vengono inseriti creando elementi personalizzati BindingElement che possono essere composti con gli altri tipi forniti dal sistema nello stack.
Ad esempio, se si implementa un oggetto LoggingBindingElement che consente di registrare il messaggio in un database, è necessario posizionarlo sopra un canale di trasporto nello stack di canali. In questo caso, l'applicazione crea un'associazione personalizzata che compone il LoggingBindingElement con il TcpTransportBindingElement, come nell'esempio seguente.
Binding customBinding = new CustomBinding(
new LoggingBindingElement(),
new TcpTransportBindingElement()
);
La modalità di scrittura del nuovo elemento di associazione dipende dalla relativa funzionalità esatta. Uno degli esempi, Transport: UDP, fornisce una descrizione dettagliata di come implementare un tipo di elemento di associazione.
Creazione di un nuovo vincolo
Un elemento di associazione creato dall'utente può essere usato in due modi. La sezione precedente illustra il primo modo: tramite un'associazione personalizzata. Un'associazione personalizzata consente all'utente di creare un'associazione personalizzata in base a un set arbitrario di elementi di associazione, inclusi quelli creati dall'utente.
Se si utilizza l'associazione in più di un'applicazione, crea un'associazione personalizzata ed estendi Binding. In questo modo si evita di creare manualmente un'associazione personalizzata ogni volta che si vuole usarla. Un'associazione definita dall'utente consente di definire il comportamento dell'associazione e includere elementi di associazione definiti dall'utente. Ed è preconfezionato: non è necessario ricostruire l'associazione ogni volta che la si utilizza.
Come minimo, un'associazione definita dall'utente deve implementare il CreateBindingElements metodo e la Scheme proprietà .
Il CreateBindingElements metodo restituisce un nuovo BindingElementCollection oggetto contenente gli elementi di associazione per l'associazione. La raccolta viene ordinata e deve contenere prima gli elementi di associazione del protocollo, seguiti dall'elemento di associazione di codifica, seguito dall'elemento di associazione del trasporto. Quando si usano gli 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 all'interno della classe di associazione definita dall'utente; di conseguenza, gli autori dell'associazione devono restituire un Clone() del BindingElementCollection a ogni chiamata a CreateBindingElements.
La Scheme proprietà rappresenta lo schema URI per il protocollo di trasporto in uso nell'associazione. Ad esempio, WSHttpBinding e NetTcpBinding restituiscono "http" e "net.tcp" dalle rispettive Scheme proprietà.
Per un elenco completo di metodi e proprietà facoltativi per le associazioni definite dall'utente, vedere Binding.
Esempio
In questo esempio viene implementata l'associazione di profili in SampleProfileUdpBinding, che deriva da Binding.
SampleProfileUdpBinding contiene fino a quattro elementi di associazione al suo interno: un UdpTransportBindingElement creato dall'utente 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 contratti duplex
Non tutti gli elementi di associazione sono compatibili tra loro. In particolare, esistono alcune restrizioni sugli elementi di associazione di sicurezza quando vengono usati con contratti duplex.
One-Shot Sicurezza
È possibile implementare la sicurezza "one-shot", in cui tutte le credenziali di sicurezza necessarie vengono inviate in un singolo messaggio impostando l'attributo dell'elemento negotiateServiceCredential di configurazione del <messaggio> su false.
L'autenticazione unica non funziona con i contratti duplex.
Per i contratti Request-Reply, l'autenticazione one-shot funziona solo se lo stack di binding sotto l'elemento di binding di sicurezza supporta la creazione di istanze IRequestChannel o IRequestSessionChannel.
Per i contratti unidirezionali, l'autenticazione one-shot funziona se lo stack di associazione sottostante l'elemento di binding di sicurezza supporta la creazione di istanze IRequestChannel, IRequestSessionChannel, IOutputChannel o IOutputSessionChannel.
Token di sicurezza in modalità contesto cookie
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 binding sottostante all'elemento di binding di sicurezza supporta la creazione di istanze IRequestChannel o istanze IRequestSessionChannel.
Per i contratti unidirezionali, i token del contesto di sicurezza in modalità cookie funzionano se il stack di associazione sotto l'elemento di sicurezza supporta la creazione di istanze di IRequestChannel o IRequestSessionChannel.
Token del contesto di sicurezza nella modalità sessione
La modalità sessione SCT funziona per i contratti duplex se lo stack di binding sottostante l'elemento di associazione di sicurezza supporta la creazione di IDuplexChannel o IDuplexSessionChannel delle istanze.
La modalità sessione SCT funziona per i contratti Request-Reply se lo stack di binding sotto l'elemento di binding di sicurezza supporta la creazione di istanze IDuplexChannel, IDuplexSessionChannel, IRequestChannel o IRequestSessionChannel.
La modalità sessione SCT funziona per contratti unidirezionali se lo stack di binding sottostante l'elemento di associazione di sicurezza supporta la creazione di istanze IDuplexChannel, IDuplexSessionChannel, IRequestChannel o IRequestSessionChannel.
Derivazione da un vincolo standard
Invece di creare una classe di associazione completamente nuova, può essere possibile estendere una delle associazioni fornite dal sistema esistenti. Analogamente al caso precedente, è necessario eseguire l'override del CreateBindingElements metodo e della Scheme proprietà .