Criando um BindingElement
Ligações e elementos de ligação (objetos que se estendem System.ServiceModel.Channels.Binding e System.ServiceModel.Channels.BindingElement, respectivamente) são o local onde o modelo de aplicativo do Windows Communication Foundation (WCF) 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 no nível do canal de serviço e Programação no nível do canal do cliente. Este tópico discute o requisito mínimo para habilitar o uso de seu canal no WCF, o desenvolvimento de um BindingElement para seu canal e habilitar o uso do aplicativo, conforme descrito na etapa 4 de Desenvolvendo canais.
Descrição geral
Criar um BindingElement para seu canal permite que os desenvolvedores o usem em um aplicativo WCF. BindingElement objetos podem ser usados a System.ServiceModel.ServiceHost partir da classe para conectar um aplicativo WCF ao seu canal sem ter que as informações precisas de tipo do seu canal.
Depois de BindingElement criado, você pode habilitar mais funcionalidades, dependendo de suas necessidades, seguindo as etapas restantes de desenvolvimento de canal descritas em Canais de desenvolvimento.
Adicionando um elemento de vinculação
Para implementar um personalizado BindingElement, escreva uma classe que herda do BindingElement. Por exemplo, se você desenvolveu um ChunkingChannel
que pode dividir mensagens grandes em partes e remontá-las na outra extremidade, você pode usar esse canal em qualquer ligação implementando e BindingElement configurando a associação para usá-la. O restante deste tópico usa o ChunkingChannel
como um exemplo para demonstrar os requisitos de implementação de um elemento de vinculação.
A ChunkingBindingElement
é responsável pela criação do ChunkingChannelFactory
e ChunkingChannelListener
. Ele substitui CanBuildChannelFactory e CanBuildChannelListener implementa e verifica se o parâmetro type é IDuplexSessionChannel (em nosso exemplo, esta é a única forma de canal suportada ChunkingChannel
pelo ) e se os outros elementos de ligação na associação suportam 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 divididas. Em seguida, cria um novo ChunkingChannelFactory
, passando-o para a fábrica de canais internos. (Se você estiver criando um elemento de vinculação de transporte, esse elemento será o último na pilha de vinculação e, portanto, deverá criar um ouvinte de canal ou fábrica de canais.)
BuildChannelListener tem uma implementação semelhante para criar ChunkingChannelListener
e passar o ouvinte do canal interno.
Como outro exemplo usando um canal de transporte, o exemplo Transport: UDP fornece a seguinte substituição.
Na amostra, o elemento de ligação é UdpTransportBindingElement
, que deriva de TransportBindingElement. Ele substitui os seguintes métodos para construir 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 e retornar nosso BindingElement
esquema (soap.udp).
Elementos de vinculação de protocolo
Novos elementos de ligação podem substituir ou aumentar qualquer um dos elementos de ligação incluídos, adicionando novos transportes, codificações ou protocolos de nível superior. Para criar um novo elemento de vinculação de protocolo, comece estendendo a BindingElement classe. No mínimo, você deve implementar o e implementar o BindingElement.CloneChannelProtectionRequirements
uso IChannel.GetPropertydo . Isso retorna o ChannelProtectionRequirements para este elemento de ligação. Para obter mais informações, veja ChannelProtectionRequirements.
Clone deve retornar uma nova cópia deste elemento de ligação. Como prática recomendada, recomendamos que os autores do elemento binding implementem Clone usando um construtor copy que chame o construtor de cópia base e, em seguida, clone quaisquer campos adicionais nessa classe.
Elementos de ligação de transporte
Para criar um novo elemento de vinculação de transporte, estenda a TransportBindingElement interface. No mínimo, você deve implementar o Clone método e a TransportBindingElement.Scheme propriedade.
Clone – Deve devolver uma nova cópia deste Elemento Vinculativo. Como prática recomendada, recomendamos que os autores do Binding Element implementem Clone por meio de um construtor copy que chame o construtor de cópia base e, em seguida, clone quaisquer campos adicionais nessa classe.
Scheme – A Scheme propriedade get retorna o esquema de URI para o protocolo de transporte representado pelo elemento de ligação. Por exemplo, o System.ServiceModel.Channels.HttpTransportBindingElement e o System.ServiceModel.Channels.TcpTransportBindingElement retorno "http" e "net.tcp" de suas respetivas Scheme propriedades.
Codificação de elementos de vinculação
Para criar novos elementos de vinculação de codificação, comece estendendo a BindingElement classe e implementando a System.ServiceModel.Channels.MessageEncodingBindingElement classe. No mínimo, você deve implementar os Clonemétodos , MessageEncodingBindingElement.CreateMessageEncoderFactory e a MessageEncodingBindingElement.MessageVersion propriedade.
Clone. Retorna uma nova cópia desse elemento de ligação. Como prática recomendada, recomendamos que os autores do elemento binding implementem Clone usando um construtor copy que chame o construtor de cópia base e, em seguida, clone quaisquer campos adicionais nessa classe.
CreateMessageEncoderFactory. Retorna um MessageEncoderFactory, que fornece um identificador para a classe real que implementa o novo codificador e que deve estender MessageEncodero . Para obter mais informações, consulte MessageEncoderFactory e MessageEncoder.
MessageVersion. Retorna o MessageVersion usado nesta codificação, que representa as versões de SOAP e WS-Addressing em uso.
Para obter uma lista completa de métodos e propriedades opcionais para elementos de vinculação de codificação definidos pelo usuário, consulte MessageEncodingBindingElement.
Para obter mais informações sobre como criar um novo elemento de ligação, consulte Criando ligações definidas pelo usuário.
Depois de criar um elemento de vinculação para seu canal, retorne ao tópico Desenvolvendo canais para ver se deseja adicionar suporte a arquivos de configuração ao elemento de vinculação, se e como adicionar suporte a publicação de metadados e se e como construir uma associação definida pelo usuário que use seu elemento de vinculação.