Creazione di una classe BindingElement
Le associazioni e gli elementi di associazione (oggetti che estendono rispettivamente le classi System.ServiceModel.Channels.Binding e System.ServiceModel.Channels.BindingElement) costituiscono la sede in cui il modello dell'applicazione Windows Communication Foundation (WCF) viene associato alle channel factory e ai listener del canale. Senza associazioni, per utilizzare canali personalizzati è necessaria una programmazione a livello di canale come descritto in Programmazione client a livello di canale e Programmazione a livello di canale client. In questo argomento vengono illustrati il requisito minimo necessario per abilitare l'utilizzo del canale in WCF, lo sviluppo di una classe BindingElement e l'abilitazione dell'utilizzo dall'applicazione come descritto nel passaggio 4 di Sviluppo di canali.
Panoramica
La creazione di un classe BindingElement per il canale ne consente agli sviluppatori l'utilizzo in un'applicazione WCF. Gli oggetti BindingElement possono essere utilizzati dalla classe System.ServiceModel.ServiceHost per connettere un'applicazione WCF al canale senza doverne precisare le informazioni sul tipo.
Una volta creata una classe BindingElement, è possibile abilitare ulteriori funzionalità a seconda delle esigenze, eseguendo i rimanenti passaggi di sviluppo del canale descritti in Sviluppo di canali.
Aggiunta di un elemento di associazione.
Per implementare una classe BindingElement personalizzata, scrivere una classe che eredita da BindingElement. Ad esempio, se è stato sviluppato un elemento ChunkingChannel
per suddividere i messaggi di grandi dimensioni in blocchi e assemblarli di nuovo sull'altra estremità, è possibile utilizzare questo canale in qualsiasi associazione implementando una classe BindingElement e configurando l'associazione per il relativo utilizzo. Nella restante parte di questo argomento, verrà utilizzato ChunkingChannel
come esempio per illustrare i requisiti dell'implementazione di un elemento di associazione.
ChunkingBindingElement
è responsabile della creazione di ChunkingChannelFactory
e ChunkingChannelListener
. Esegue l'override delle implementazioni dei metodi CanBuildChannelFactory e CanBuildChannelListener e controlla che il parametro di tipo sia IDuplexSessionChannel (nell'esempio si tratta dell'unica forma del canale supportata da ChunkingChannel
) e che gli altri elementi di associazione presenti nell'associazione supportino tale forma.
Il metodo BuildChannelFactory controlla prima che la forma del canale richiesta possa essere creata e poi ottiene un elenco di azioni del messaggio da suddividere in blocchi. Crea quindi una nuova ChunkingChannelFactory
, passando la channel factory interna (se si sta creando un elemento di associazione del trasporto, tale elemento è l'ultimo nello stack dell'associazione e pertanto deve necessariamente creare un listener del canale o una channel factory).
L'implementazione del metodo BuildChannelListener per creare ChunkingChannelListener
e passare il listener del canale interno è simile.
Come ulteriore esempio di utilizzo di un canale di trasporto, in Transport: UDP viene fornito l'override seguente.
Nell'esempio, l'elemento di associazione è UdpTransportBindingElement
, che deriva dalla classe TransportBindingElement. Esso esegue l'override dei metodi seguenti per creare le factory associate al canale.
public IChannelFactory<TChannel> BuildChannelFactory<TChannel>(BindingContext context)
{
return (IChannelFactory<TChannel>)(object)new UdpChannelFactory(this, context);
}
public IChannelListener<TChannel> BuildChannelListener<TChannel>(BindingContext context)
{
return (IChannelListener<TChannel>)(object)new UdpChannelListener(this, context);
}
Contiene inoltre membri per duplicare BindingElement
e restituire lo schema (soap.udp).
Elementi di associazione di protocollo
I nuovi elementi di associazione possono sostituire o aumentare gli elementi di associazione presenti, aggiungendo nuovi trasporti, codifiche o protocolli di livello superiore. Per creare un nuovo elemento di associazione di protocollo, iniziare estendendo la classe BindingElement. È necessario quindi implementare almeno il metodo System.ServiceModel.Channels.BindingElement.Clone e ChannelProtectionRequirements utilizzando il metodo System.ServiceModel.Channels.IChannel.GetProperty. In questo modo viene restituita la classe ChannelProtectionRequirements per l'elemento di associazione. Per ulteriori informazioni, vedere ChannelProtectionRequirements.
Il metodo Clone deve restituire una copia aggiornata dell'elemento di associazione. È consigliabile che gli autori dell'elemento di associazione implementino il metodo Clone utilizzando un costruttore di copia che chiami il costruttore di copia di base e che quindi duplichi i campi aggiuntivi in questa classe.
Elementi di associazione del trasporto
Per creare un nuovo elemento di associazione del trasporto, estendere l'interfaccia TransportBindingElement. È necessario quindi implementare almeno il metodo Clone e la proprietà System.ServiceModel.Channels.TransportBindingElement.Scheme.
Clone – Deve restituire una copia aggiornata dell'elemento di associazione. È consigliabile che gli autori dell'elemento di associazione implementino Clone mediante un costruttore di copia che chiami il costruttore di copia di base e che quindi duplichi i campi aggiuntivi in questa classe.
Scheme – La proprietà Scheme restituisce lo schema URI per il protocollo di trasporto rappresentato dall'elemento di associazione. Ad esempio, le classi System.ServiceModel.Channels.HttpTransportBindingElement e System.ServiceModel.Channels.TcpTransportBindingElement restituiscono "http" e "net.tcp" dalle rispettive proprietà Scheme.
Elementi di associazione di codifica
Per creare un nuovo elemento di associazione di codifica, iniziare estendendo la classe BindingElement e implementando la classe System.ServiceModel.Channels.MessageEncodingBindingElement. È necessario quindi implementare almeno i metodi Clonee System.ServiceModel.Channels.MessageEncodingBindingElement.CreateMessageEncoderFactorye la proprietà System.ServiceModel.Channels.MessageEncodingBindingElement.MessageVersion.
- Clone. Restituisce una copia aggiornata dell'elemento di associazione. È consigliabile che gli autori dell'elemento di associazione implementino il metodo Clone utilizzando un costruttore di copia che chiami il costruttore di copia di base e che quindi duplichi i campi aggiuntivi in questa classe.
- CreateMessageEncoderFactory. Restituisce una classe MessageEncoderFactory che fornisce un handle alla classe effettiva che implementa il nuovo codificatore e che deve estendere la classe MessageEncoder. Per ulteriori informazioni, vedere MessageEncoderFactory e MessageEncoder.
- MessageVersion. Restituisce la classe MessageVersion utilizzata in questa codifica, che rappresenta le versioni di SOAP e WS-Addressing utilizzate.
Per un elenco completo dei metodi e delle proprietà facoltative per gli elementi di associazione di codifica definiti dall'utente, vedere MessageEncodingBindingElement.
Per ulteriori informazioni sulla creazione di un nuovo elemento di associazione, vedere Creazione di associazioni definite dall'utente.
Una volta creato un elemento di associazione per il canale, tornare all'argomento Sviluppo di canali per verificare se si desidera aggiungere il supporto file di configurazione all'elemento di associazione, se e come aggiungere il supporto per la pubblicazione di metadati e se e come costruire un'associazione definita dall'utente che gli utilizzi l'elemento di associazione.