Client: Kanalfactorys und Kanäle
In diesem Thema wird die Erstellung von Kanalfactorys und Kanälen erläutert.
Kanalfactorys und Kanäle
Kanalfactorys sind für das Erstellen von Kanälen zuständig. Von Kanalfactorys erstellte Kanäle werden zum Senden von Nachrichten verwendet. Diese Kanäle dienen dem Abrufen von Nachrichten von der oberen Ebene. Die Kanäle führen jede erforderliche Verarbeitung aus und senden anschließend die Nachricht an die untere Ebene. Dieser Vorgang wird in der folgenden Grafik dargestellt.
Eine Kanalfactory dient zum Erstellen von Kanälen.
Bei der Schließung von Kanalfactorys sind diese für das Schließen aller von ihnen erstellten Kanäle zuständig, die noch nicht geschlossen wurden. Das Modell wird hier asymmetrisch dargestellt, da ein Kanallistener bei seiner Schließung zwar keine neuen Kanäle mehr akzeptiert, vorhandene Kanäle jedoch geöffnet bleiben, damit von diesen weiterhin Nachrichten empfangen werden können.
WCF stellt Basisklassenhilfen für diesen Prozess bereit. (Ein Diagramm der in diesem Thema beschriebenen 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 System.ServiceModel.Channels.ChannelFactoryBase und System.ServiceModel.Channels.ChannelListenerBase bereit. Die ChannelManagerBase-Klasse funktioniert in Verbindung mit ChannelBase. Dies ist eine Basisklasse, die IChannel implementiert.
Die ChannelFactoryBase-Klasse implementiert ChannelManagerBase und IChannelFactory und konsolidiert 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 einer Kanalfactory
Die UdpChannelFactory
wird von ChannelFactoryBase abgeleitet. Das Beispiel überschreibt GetProperty, um Zugriff auf die Nachrichtenversion des Nachrichtenencoders zu gewähren. Das Beispiel überschreibt auch OnClose, um beim Übergang des Zustandsautomaten die Instanz von BufferManager zu beenden.
Der UDP-Ausgabekanal
Der UdpOutputChannel
implementiert IOutputChannel. Der Konstruktor überprüft die Argumente und erstellt ein Ziel-EndPoint-Objekt, das auf der übergebenen EndpointAddress basiert.
Durch die Überschreibung von OnOpen wird ein Socket erstellt, der zum Senden von Nachrichten an diesen EndPoint verwendet wird.
this.socket = new Socket(
this.remoteEndPoint.AddressFamily,
SocketType.Dgram,
ProtocolType.Udp
);
Der Kanal kann ordnungsgemäß oder nicht ordnungsgemäß geschlossen werden. Bei ordnungsgemäßer Schließung wird der Socket geschlossen, und die OnClose
-Methode der Basisklasse wird aufgerufen. Wenn dadurch eine Ausnahme ausgelöst wird, ruft die Infrastruktur Abort
auf, um sicherzustellen, dass der Kanal bereinigt wird.
this.socket.Close();
base.OnClose(timeout);
Implementieren Sie Send()
und BeginSend()
/EndSend()
. Dieser Vorgang ist in zwei Hauptabschnitte unterteilt. Serialisieren Sie zuerst die Nachricht in ein Bytearray:
ArraySegment<byte> messageBuffer = EncodeMessage(message);
Senden Sie anschließend die resultierenden Daten:
this.socket.SendTo(
messageBuffer.Array,
messageBuffer.Offset,
messageBuffer.Count,
SocketFlags.None,
this.remoteEndPoint
);