Creazione di una classe BindingElement

I binding e gli elementi di binding (oggetti che estendono rispettivamente le classi System.ServiceModel.Channels.Binding e System.ServiceModel.Channels.BindingElement) costituiscono la sede in cui il modello dell'applicazione WCF (Windows Communication Foundation) viene associato alle channel factory e ai listener del canale. Senza binding, l'uso di canali personalizzati richiede la programmazione a livello di canale, come descritto in Programmazione a livello di canale del servizio e programmazione a livello di canale del client. In questo argomento vengono illustrati il requisito minimo necessario per abilitare l'uso del canale in WCF, lo sviluppo di una classe BindingElement e l'abilitazione dell'uso dall'applicazione come descritto nel passaggio 4 di Sviluppo di canali.

Panoramica

La creazione di un oggetto BindingElement per il canale consente agli sviluppatori di usarlo in un'applicazione WCF. Gli oggetti BindingElement possono essere usati dalla classe System.ServiceModel.ServiceHost per connettere un'applicazione 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, 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 uso di un canale di trasporto, in Trasporto: 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 BindingElement.Clone e ChannelProtectionRequirements tramite 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à 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 Clone e MessageEncodingBindingElement.CreateMessageEncoderFactory e la proprietà 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 altre 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 altre informazioni sulla creazione di un nuovo elemento di binding, vedere Creazione di binding definite dall'utente.

Una volta creato un elemento di binding per il canale, tornare all'argomento Sviluppo di canali per verificare se si desidera aggiungere il supporto file di configurazione all'elemento di binding, se e come aggiungere il supporto per la pubblicazione di metadati e se e come costruire un binding definito dall'utente che usi l'elemento di binding.

Vedi anche