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.
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 mentionnées dans cette rubrique, consultez Vue d'ensemble du modèle de canal.)
- La classe CommunicationObject implémente ICommunicationObject et applique l'ordinateur d'état décrit à l'étape 2 de Développement de canaux.
- La classe
- La classe
CreateChannel
dans une méthode abstraiteOnCreateChannel
. - La classe
La discussion qui suit s'appuie 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 du codeur 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 normale ou anormale. 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 ê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
);