Dienst: Kanallistener und Kanäle
Es gibt drei Kategorien von Kanalobjekten: Kanäle, Kanallistener und Kanalfactorys. Kanäle sind die Schnittstelle zwischen der Anwendung und dem Kanalstapel. Kanallistener sind für die Erstellung von Kanälen auf der Empfänger- (oder Abhör-)Seite zuständig, normalerweise als Reaktion auf eine neue eingehende Nachricht oder Verbindung. Kanalfactorys sind dafür zuständig, Kanäle auf der Senderseite zu erstellen, um eine Kommunikation mit einem Endpunkt zu initiieren.
Kanallistener und Kanäle
Kanallistener sind für die Erstellung von Kanälen und den Empfang von Nachrichten von der unteren Ebene oder vom Netzwerk zuständig. Empfangene Nachrichten werden der oberen Ebene mithilfe eines Kanals, der durch den Kanallistener erstellt wird, zugestellt.
Im folgenden Diagramm wird der Prozess des Empfangs von Nachrichten und ihrer Übermittlung an die obere Ebene veranschaulicht.
Der Prozess kann in jedem Kanal als Warteschlange konzipiert werden, obwohl die Implementierung möglicherweise keine Warteschlange verwendet. Der Kanallistener ist dafür zuständig, Nachrichten von der unteren Ebene oder vom Netzwerk zu empfangen und sie in die Warteschlange zu stellen. Der Kanal ist für das Abrufen von Nachrichten aus der Warteschlange und ihre Übergabe an die obere Ebene zuständig, wenn diese Ebene eine Nachricht anfordert, z. B. durch Aufrufen von Receive im Kanal.
WCF stellt Basisklassenhilfen für diesen Prozess bereit. (Ein Diagramm der in diesem Thema erläuterten Kanalhilfsklassen finden Sie unter Übersicht über das Kanalmodell.)
Die CommunicationObject-Klasse implementiert ICommunicationObject und setzt den in Schritt 2 von Entwickeln von Kanälen beschriebenen Zustandsautomaten durch.
Die ChannelManagerBase-Klasse implementiert CommunicationObject und stellt eine einheitliche Basisklasse für ChannelFactoryBase und ChannelListenerBase bereit. Die ChannelManagerBase-Klasse funktioniert in Verbindung mit ChannelBase. Dies ist eine Basisklasse, die IChannel implementiert.
Die
CreateChannel
-Überladungen in einer abstraktenOnCreateChannel
-Methode.Die ChannelListenerBase-Klasse implementiert IChannelListener. Die Klasse wird für grundlegende Zustandsverwaltung verwendet.
Die folgende Diskussion basiert auf dem Transport: UDP-Beispiel.
Erstellen eines Kanallisteners
Der
UdpChannelListener, der in dem Beispiel implementiert wird, wird von der ChannelListenerBase-Klasse abgeleitet. Er verwendet einen einzelnen UDP-Socket, um Datagramme zu empfangen. Die OnOpen
-Methode empfängt Daten mit dem UDP-Socket in einer asynchronen Schleife. Die Daten werden dann mit dem Nachrichtencodierungssystem in Nachrichten konvertiert:
message = UdpConstants.MessageEncoder.ReadMessage(
new ArraySegment<byte>(buffer, 0, count),
bufferManager
);
Da derselbe Datagrammkanal Nachrichten darstellt, die aus einer Reihe von Quellen eintreffen, ist der UdpChannelListener
ein Singletonlistener. Es gibt höchstens einen aktiven IChannel
, der diesem Listener gleichzeitig zugeordnet ist. In diesem Beispiel wird nur dann ein weiterer generiert, wenn ein Kanal, der mit der AcceptChannel-Methode zurückgegeben wird, anschließend freigegeben wird. Wenn eine Nachricht empfangen wird, wird sie in diesem Singletonkanal in die Warteschlange eingereiht.
UdpInputChannel
Die UdpInputChannel
-Klasse implementiert IInputChannel. Sie besteht aus einer Warteschlange mit eingehenden Nachrichten, die vom UdpChannelListener
-Socket gefüllt wird. Diese Nachrichten werden mit der Receive-Methode aus der Warteschlange entfernt.