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.

Clientfactorys und Clientkanäle

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 erläuterten Kanalhilfsklassen finden Sie unter Übersicht über das Kanalmodell.)

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
);

Siehe auch

Konzepte

Entwickeln von Kanälen