Client : Fabrications de canaux et canaux

Cette rubrique décrit la création de fabrications de canaux et de canaux.

Fabrications de canaux et canaux

Les fabrications de canaux sont chargées de créer des canaux. Les canaux créés par les fabrications de canaux sont utilisés pour l'envoi de messages. Ces canaux sont chargés d'obtenir le message de la couche supérieure, quel que soit le traitement nécessaire pour y arriver, puis de l'envoyer à la couche inférieure. Le graphique ci-dessous illustre ce processus.

Client Factories and Channels
Une fabrication de canal crée des canaux.

Une fois fermées, les fabrications de canaux sont chargées de fermer tous les canaux qu'elles ont créés et qui ne sont pas déjà fermés. Notez que le modèle présenté ici est asymétrique car lorsqu'un écouteur de canal est fermé, il cesse seulement d'accepter de nouveaux canaux mais laisse les canaux existants ouverts afin qu'ils puissent continuer à recevoir des messages.

WCF fournit des assistants de classe de base pour ce processus. (Pour obtenir un diagramme des classes d’assistance de canal décrites dans cette rubrique, consultez Vue d’ensemble du modèle de canal.)

La discussion suivante est basée sur l’exemple Transport : UDP.

Création d'une fabrication de canal

UdpChannelFactory dérive de ChannelFactoryBase. L'exemple substitue GetProperty pour fournir un accès à la version du message de l'encodeur de message. L'exemple substitue également OnClose pour détruire notre instance de BufferManager lors des transitions d'ordinateurs d'état.

Canal de sortie UDP

UdpOutputChannel implémente IOutputChannel. Le constructeur valide les arguments et construit un objet EndPoint de destination reposant sur le EndpointAddress qui est passé.

La substitution de la méthode OnOpen crée un socket qui est utilisé pour envoyer des messages à ce EndPoint.

this.socket = new Socket(  
this.remoteEndPoint.AddressFamily,
  SocketType.Dgram,
  ProtocolType.Udp
);  

Le canal peut être fermé de façon appropriée ou incorrecte. Si le canal est fermé de façon normale, le socket est fermé et un appel à la méthode OnClose de la classe de base est réalisé. Si une exception est alors levée, l'infrastructure appelle Abort pour veiller à ce que le canal soit nettoyé.

this.socket.Close();  
base.OnClose(timeout);  

Implémentez Send() et BeginSend()/EndSend(). Deux phases peuvent alors être distinguées. Tout d'abord, la sérialisation du message dans un tableau d'octets :

ArraySegment<byte> messageBuffer = EncodeMessage(message);  

Puis, l'envoi des données obtenues sur le câble :

this.socket.SendTo(  
  messageBuffer.Array,
  messageBuffer.Offset,
  messageBuffer.Count,
  SocketFlags.None,
  this.remoteEndPoint  
);  

Voir aussi