Cliente: Fábricas de canais e canais
Este tópico discute a criação de fábricas e canais de canais.
Fábricas e Canais de Canais
As fábricas de canais são responsáveis pela criação de canais. Os canais criados pelas fábricas de canais são usados para enviar mensagens. Esses canais são responsáveis por obter a mensagem da camada acima, realizar qualquer processamento necessário e, em seguida, 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 criados que ainda não estão fechados. Observe que o modelo é assimétrico aqui porque quando um ouvinte de canal é fechado, ele só para de aceitar novos canais, mas deixa os canais existentes abertos para que eles possam continuar recebendo mensagens.
O WCF fornece auxiliares de classe base para esse processo. (Para obter um diagrama das classes auxiliares de canal discutidas neste tópico, consulte Visão geral do modelo de canal.)
A CommunicationObject classe implementa ICommunicationObject e impõe a máquina de estado descrita na etapa 2 de Canais em desenvolvimento.
A ChannelManagerBase classe implementa CommunicationObject e fornece uma classe base unificada para System.ServiceModel.Channels.ChannelFactoryBase e System.ServiceModel.Channels.ChannelListenerBase. A ChannelManagerBase classe trabalha em conjunto com ChannelBase, que é uma classe base que implementa IChannelo .
A ChannelFactoryBase classe implementa ChannelManagerBase e IChannelFactory consolida as
CreateChannel
sobrecargas em umOnCreateChannel
método abstrato.A ChannelListenerBase classe implementa IChannelListener. Cuida da gestão básica do Estado.
A discussão a seguir é baseada no exemplo Transport: UDP .
Criando uma fábrica de canais
O UdpChannelFactory
deriva de ChannelFactoryBase. O exemplo substitui GetProperty para fornecer acesso à versão da mensagem do codificador de mensagens. O exemplo também substitui OnClose para derrubar nossa instância de quando a máquina de BufferManager 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 de destino EndPoint com base no EndpointAddress que é passado.
A substituição de OnOpen cria um soquete que é usado para enviar mensagens para este EndPoint.
this.socket = new Socket(
this.remoteEndPoint.AddressFamily,
SocketType.Dgram,
ProtocolType.Udp
);
O canal pode ser fechado graciosamente ou sem graça. Se o canal estiver fechado normalmente, o soquete será fechado e uma chamada será feita para o método de classe OnClose
base. Se isso gerar uma exceção, a infraestrutura chamará Abort
para garantir que o canal seja limpo.
this.socket.Close();
base.OnClose(timeout);
Implementar Send()
e BeginSend()
/EndSend()
. Esta divide-se em duas secções principais. Primeiro, serialize a mensagem em uma matriz de bytes:
ArraySegment<byte> messageBuffer = EncodeMessage(message);
Em seguida, envie os dados resultantes no fio:
this.socket.SendTo(
messageBuffer.Array,
messageBuffer.Offset,
messageBuffer.Count,
SocketFlags.None,
this.remoteEndPoint
);