Partilhar via


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.

Client Factories and Channels
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 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  
);  

Consulte também