Service : écouteurs de canal et canaux
Il existe trois catégories d'objets de canal : les canaux, les écouteurs de canal et les fabrications de canaux. Les canaux sont l'interface entre l'application et la pile de canaux. Les écouteurs de canal sont chargés de créer des canaux du côté réception (ou écoute), généralement en réponse à une nouvelle connexion ou un nouveau message entrant. Les fabrications de canaux sont chargées de créer des canaux du côté envoi afin d'initier la communication avec un point de terminaison.
Écouteurs de canal et canaux
Les écouteurs de canal sont chargés de créer des canaux et de recevoir les messages de la couche inférieure ou du réseau. Les messages reçus sont remis à la couche supérieure à l'aide d'un canal créé par l'écouteur de canal.
Le diagramme suivant illustre le processus de réception des messages et de leur remise à la couche supérieure.
Le processus peut être modelé conceptuellement comme une file d'attente à l'intérieur de chaque canal, bien que l'implémentation n'utilise pas obligatoirement de file d'attente. L'écouteur de canal est chargé de recevoir les messages de la couche inférieure ou du réseau et de les mettre dans la file d'attente. Le canal est chargé d'obtenir des messages de la file d'attente et de les transmettre à la couche supérieure lorsque celle-ci demande un message, par exemple en appelant Receive sur le canal.
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 ChannelManagerBase implémente un objet CommunicationObject et fournit une classe de base unifiée pour ChannelFactoryBase et ChannelListenerBase. La classe ChannelManagerBase fonctionne avec ChannelBase, qui est une classe de base implémentant IChannel.
La classe
CreateChannel
dans une méthode abstraiteOnCreateChannel
.La classe ChannelListenerBase implémente IChannelListener. Elle se charge de la gestion d'état de base.
La discussion qui suit s'appuie sur l'exemple Transport: UDP.
Création d'un écouteur de canal
L'élément
UdpChannelListener implémenté par l'exemple dérive de la classe ChannelListenerBase. Il utilise un socket UDP unique pour recevoir des datagrammes. La méthode OnOpen
reçoit des données à l'aide du socket UDP dans une boucle asynchrone. Les données sont ensuite converties en messages à l'aide du système d'encodage de message :
message = UdpConstants.MessageEncoder.ReadMessage(
new ArraySegment<byte>(buffer, 0, count),
bufferManager
);
Étant donné que le même canal de datagramme représente des messages qui arrivent de plusieurs sources, l'UdpChannelListener
est un écouteur Singleton. Il y a, au plus, un objet IChannel
actif associé à cet écouteur à la fois. L'exemple en génère un autre uniquement si un canal retourné par la méthode AcceptChannel est disposé par la suite. Lorsqu'un message est reçu, il est mis en file d'attente dans ce canal singleton.
UdpInputChannel
La classe UdpInputChannel
implémente IInputChannel. Elle se compose d'une file d'attente de messages entrants remplie par le socket de UdpChannelListener
. Ces messages sont extraits de la file d'attente par la méthode Receive.