Criando um BindingElement

Associações e elementos de associação (objetos que se estendem System.ServiceModel.Channels.Binding e System.ServiceModel.Channels.BindingElement, respectivamente) são o local em que o modelo de aplicativo WCF (Windows Communication Foundation) está associado a fábricas de canais e ouvintes de canal. Sem associações, o uso de canais personalizados requer programação no nível do canal, conforme descrito em Programação de nível de canal de serviço e Programação de nível de canal de cliente. Este tópico discute o requisito mínimo para habilitar o uso do canal no WCF, o desenvolvimento de um BindingElement para o canal, e habilitar o uso do aplicativo, conforme descrito na etapa 4 de Desenvolver canais.

Visão geral

A criação de um BindingElement para o canal permite que os desenvolvedores o usem em um aplicativo WCF. Os objetos BindingElement podem ser usados na classe System.ServiceModel.ServiceHost para conectar um aplicativo WCF ao canal sem precisar das informações precisas do seu canal.

Depois que um BindingElement tiver sido criado, você poderá habilitar mais funcionalidade dependendo de seus requisitos seguindo as etapas restantes de desenvolvimento de canal descritas no Desenvolver canais.

Adicionar um elemento de associação

Para implementar um BindingElement personalizado, escreva uma classe herdada de BindingElement. Por exemplo, se você desenvolveu um ChunkingChannel que pode dividir mensagens grandes em partes e reagrupá-las na outra extremidade, você poderá usar esse canal em qualquer associação implementando um BindingElement e configurando a associação para usá-lo. O restante deste tópico usa o ChunkingChannel como exemplo para demonstrar os requisitos de implementação de um elemento de associação.

Um ChunkingBindingElement é responsável por criar o ChunkingChannelFactory e o ChunkingChannelListener. Ele substitui as implementações de CanBuildChannelFactory e CanBuildChannelListener e verifica se o parâmetro de tipo é IDuplexSessionChannel (em nosso exemplo, esta é a única forma de canal compatível com o ChunkingChannel) e que os outros elementos de associação na associação dão suporte a essa forma de canal.

BuildChannelFactory primeiro verifica se a forma de canal solicitada pode ser criada e, em seguida, obtém uma lista de ações de mensagem a serem agrupadas. Em seguida, ele cria um novo ChunkingChannelFactory, passando-o a fábrica de canal interno. (Se você estiver criando um elemento de associação de transporte, esse elemento será o último na pilha de associação e, portanto, deverá criar um ouvinte de canal ou uma fábrica de canais).

BuildChannelListener tem uma implementação semelhante para criar ChunkingChannelListener e passar o ouvinte de canal interno.

Como outro exemplo usando um canal de transporte, o exemplo Transporte: UDP fornece a seguinte substituição.

No exemplo, o elemento de associação é UdpTransportBindingElement, que deriva de TransportBindingElement. Ele substitui os métodos a seguir para criar as fábricas associadas ao canal.

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);  
}  

Ele também contém membros para clonar o BindingElement e retornar nosso esquema (soap.udp).

Elementos de associação de protocolo

Novos elementos de associação podem substituir ou aumentar qualquer um dos elementos de associação incluídos, adicionando novos transportes, codificações ou protocolos de nível superior. Para criar um novo elemento de associação de protocolo, comece estendendo a classe BindingElement. No mínimo, você deve implementar o BindingElement.Clone implementar o ChannelProtectionRequirements usando o IChannel.GetProperty. Isso retorna o ChannelProtectionRequirements para esse elemento de associação. Para obter mais informações, consulte ChannelProtectionRequirements.

Clone deve retornar uma nova cópia desse elemento de associação. Como prática recomendada, recomendamos que os autores de elementos de associação implementem Clone usando um construtor de cópia que chama o construtor de cópia base e, em seguida, clona quaisquer campos adicionais nessa classe.

Elementos de associação de transporte

Para criar um novo elemento de associação de transporte, estenda a interface TransportBindingElement. No mínimo, você deve implementar o método Clone e a propriedade TransportBindingElement.Scheme.

Clone – Deve retornar uma nova cópia desse elemento de associação. Como prática recomendada, recomendamos que os autores de elementos de associação implementem Clone por meio de um construtor de cópia que chama o construtor de cópia base e, em seguida, clona quaisquer campos adicionais nessa classe.

Scheme – A propriedade get Scheme retorna o esquema de URI para o protocolo de transporte representado pelo elemento de associação. Por exemplo, o System.ServiceModel.Channels.HttpTransportBindingElement e o System.ServiceModel.Channels.TcpTransportBindingElement retornam "http" e "net.tcp" de suas respectivas propriedades Scheme.

Elementos de associação de codificação

Para criar novos elementos de associação de codificação, comece estendendo a classe BindingElement e implementando a classe System.ServiceModel.Channels.MessageEncodingBindingElement. No mínimo, você deve implementar os métodos Clone, MessageEncodingBindingElement.CreateMessageEncoderFactory e a propriedade MessageEncodingBindingElement.MessageVersion.

  • Clone. Retorna uma nova cópia desse elemento de associação. Como prática recomendada, recomendamos que os autores de elementos de associação implementem Clone usando um construtor de cópia que chama o construtor de cópia base e, em seguida, clona quaisquer campos adicionais nessa classe.

  • CreateMessageEncoderFactory. Retorna um MessageEncoderFactory, que fornece um identificador para a classe real que implementa seu novo codificador e que deve estender MessageEncoder. Para obter mais informações, consulte MessageEncoderFactory e MessageEncoder.

  • MessageVersion. Retorna o MessageVersion usado nessa codificação, que representa as versões do SOAP e do WS-Addressing em uso.

Para obter uma listagem completa de métodos e propriedades opcionais para elementos de associação de codificação definidos pelo usuário, consulte MessageEncodingBindingElement.

Para obter mais informações sobre como criar um novo elemento de associação, consulte Criar associações definidas pelo usuário.

Depois de criar um elemento de associação para o canal, retorne ao tópico Desenvolver canais para ver se deseja adicionar suporte ao arquivo de configuração ao elemento de associação, se e como adicionar suporte à publicação de metadados e se e como construir uma associação definida pelo usuário que usa o elemento de associação.

Confira também