Compartilhar via


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.

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

Confira também