Client: Kanalfactorys und KanäleClient: Channel Factories and Channels

In diesem Thema wird die Erstellung von Kanalfactorys und Kanälen erläutert.This topic discusses the creation of channel factories and channels.

Kanalfactorys und KanäleChannel Factories and Channels

Kanalfactorys sind für das Erstellen von Kanälen zuständig.Channel factories are responsible for creating channels. Von Kanalfactorys erstellte Kanäle werden zum Senden von Nachrichten verwendet.Channels created by channel factories are used for sending messages. 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.These channels are responsible for getting the message from the layer above, performing whatever processing is necessary, then sending the message to the layer below. Dieser Vorgang wird in der folgenden Grafik dargestellt.The following graphic illustrates this process.

Clientfactorys und-KanäleClient Factories and Channels
Eine Kanalfactory dient zum Erstellen von Kanälen.A channel factory creates channels.

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.When closed, channel factories are responsible for closing any channels they created that are not yet closed. 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.Note that the model is asymmetric here because when a channel listener is closed, it only stops accepting new channels but leaves existing channels open so that they can continue receiving messages.

WCFWCF stellt Basisklassenhilfen für diesen Prozess bereit. provides base class helpers for this process. (Ein Diagramm der Kanal Hilfsklassen, die in diesem Thema erläutert, finden Sie unter Übersicht über das Kanalmodell.)(For a diagram of the channel helper classes discussed in this topic, see Channel Model Overview.)

Die folgende Diskussion basiert auf der Transport: UDP Beispiel.The following discussion is based upon the Transport: UDP sample.

Erstellen einer KanalfactoryCreating a Channel Factory

Die UdpChannelFactory wird von ChannelFactoryBase abgeleitet.The UdpChannelFactory derives from ChannelFactoryBase. Das Beispiel überschreibt GetProperty, um Zugriff auf die Nachrichtenversion des Nachrichtenencoders zu gewähren.The sample overrides GetProperty to provide access to the message version of the message encoder. Das Beispiel überschreibt auch OnClose, um beim Übergang des Zustandsautomaten die Instanz von BufferManager zu beenden.The sample also overrides OnClose to tear down our instance of BufferManager when the state machine transitions.

Der UDP-AusgabekanalThe UDP Output Channel

Der UdpOutputChannel implementiert IOutputChannel.The UdpOutputChannel implements IOutputChannel. Der Konstruktor überprüft die Argumente und erstellt ein Ziel-EndPoint-Objekt, das auf der übergebenen EndpointAddress basiert.The constructor validates the arguments and constructs a destination EndPoint object based on the EndpointAddress that is passed in.

Durch die Überschreibung von OnOpen wird ein Socket erstellt, der zum Senden von Nachrichten an diesen EndPoint verwendet wird.The override of OnOpen creates a socket that is used to send messages to this EndPoint.

this.socket = new Socket(

this.remoteEndPoint.AddressFamily,

SocketType.Dgram,

ProtocolType.Udp

);

Der Kanal kann ordnungsgemäß oder nicht ordnungsgemäß geschlossen werden.The channel can be closed gracefully or ungracefully. Bei ordnungsgemäßer Schließung wird der Socket geschlossen, und die OnClose-Methode der Basisklasse wird aufgerufen.If the channel is closed gracefully the socket is closed and a call is made to the base class OnClose method. Wenn dadurch eine Ausnahme ausgelöst wird, ruft die Infrastruktur Abort auf, um sicherzustellen, dass der Kanal bereinigt wird.If this throws an exception, the infrastructure calls Abort to ensure the channel is cleaned up.

this.socket.Close();  
base.OnClose(timeout);  

Implementieren Send() und BeginSend() / EndSend().Implement Send() and BeginSend()/EndSend(). Dieser Vorgang ist in zwei Hauptabschnitte unterteilt.This breaks down into two main sections. Serialisieren Sie zuerst die Nachricht in ein Bytearray:First serialize the message into a byte array:

ArraySegment<byte> messageBuffer = EncodeMessage(message);  

Senden Sie anschließend die resultierenden Daten:Then send the resulting data on the wire:

this.socket.SendTo(  
  messageBuffer.Array,   
  messageBuffer.Offset,   
  messageBuffer.Count,   
  SocketFlags.None,   
  this.remoteEndPoint  
);  

Siehe auchSee Also

Entwickeln von KanälenDeveloping Channels