Cliente: fábricas de canais e canais
Este tópico aborda a criação de canais e fábricas de canais.
fábricas de canais e canais
As fábricas de canais são responsáveis pela criação de canais. Canais criados por fábricas de canais são usados para enviar mensagens. Esses canais são responsáveis por obter a mensagem da camada acima, executar o processamento necessário e enviar a mensagem para a camada abaixo. O gráfico a seguir ilustra esse processo.
Uma fábrica de canais cria canais.
Quando fechadas, as fábricas de canais são responsáveis por fechar os canais que criaram que ainda não foram fechados. Observe que o modelo é assimétrico, porque quando um ouvinte de canais é fechado, ele só para de aceitar novos canais, mas deixa os canais existentes abertos para que possam continuar recebendo mensagens.
O WCF fornece auxiliares de classe base para esse processo. (Para ver um diagrama das classes auxiliares de canal discutidas neste tópico, consulte Visão geral do modelo de canal.)
A classe CommunicationObject implementa ICommunicationObject e impõe a máquina de estado descrita na etapa 2 de Desenvolvendo canais.
A classe ChannelManagerBase implementa o CommunicationObject e fornece uma classe base unificada para System.ServiceModel.Channels.ChannelFactoryBase e System.ServiceModel.Channels.ChannelListenerBase. A classe ChannelManagerBase funciona em conjunto com a ChannelBase, que é uma classe base que implementa IChannel.
A classe ChannelFactoryBase implementa ChannelManagerBase e IChannelFactory e consolida as sobrecargas de
CreateChannel
em um método abstratoOnCreateChannel
.A classe ChannelListenerBase implementa IChannelListener. Ela cuida do gerenciamento básico do estado.
A discussão a seguir baseia-se no exemplo Transporte: UDP.
Criando uma fábrica de canais
A UdpChannelFactory
deriva de ChannelFactoryBase. A amostra substitui GetProperty para fornecer acesso à versão da mensagem do codificador de mensagens. A amostra também substitui OnClose para derrubar nossa instância de BufferManager quando a máquina de estado faz a transição.
O canal de saída UDP
Os UdpOutputChannel
implementos IOutputChannel. O construtor valida os argumentos e constrói um objeto EndPoint de destino com base no EndpointAddress que é passado.
A substituição de OnOpen cria um soquete usado para enviar mensagens para este EndPoint.
this.socket = new Socket(
this.remoteEndPoint.AddressFamily,
SocketType.Dgram,
ProtocolType.Udp
);
O canal pode ser fechado de forma coordenada ou descoordenada. Se o canal for fechado de forma coordenada, o soquete será fechado e uma chamada será feita para o método OnClose
da classe base. Se isso gerar uma exceção, a infraestrutura chamará Abort
para garantir que o canal seja limpo.
this.socket.Close();
base.OnClose(timeout);
Implemente Send()
e BeginSend()
/EndSend()
. Isso se divide em duas seções principais. Primeiro, serialize a mensagem em uma matriz de bytes:
ArraySegment<byte> messageBuffer = EncodeMessage(message);
Em seguida, envie os dados resultantes pela rede:
this.socket.SendTo(
messageBuffer.Array,
messageBuffer.Offset,
messageBuffer.Count,
SocketFlags.None,
this.remoteEndPoint
);