Delen via


Client: Kanaalfactory's en kanalen

In dit onderwerp wordt het maken van kanaalfactory's en kanalen besproken.

Kanaalfactory's en kanalen

Kanaalfactory's zijn verantwoordelijk voor het maken van kanalen. Kanalen die zijn gemaakt door kanaalfactory's worden gebruikt voor het verzenden van berichten. Deze kanalen zijn verantwoordelijk voor het ophalen van het bericht uit de bovenstaande laag, het uitvoeren van de verwerking die nodig is en vervolgens het bericht verzenden naar de onderstaande laag. In de volgende afbeelding ziet u dit proces.

Client Factories and Channels
Een kanaalfactory maakt kanalen.

Wanneer de kanaalfactory's zijn gesloten, zijn ze verantwoordelijk voor het sluiten van kanalen die ze nog niet hebben gesloten. Houd er rekening mee dat het model hier asymmetrisch is, omdat wanneer een kanaallistener is gesloten, alleen nieuwe kanalen accepteert, maar bestaande kanalen open laat, zodat ze berichten kunnen blijven ontvangen.

WCF biedt basisklasse-helpers voor dit proces. (Zie voor een diagram van de kanaalhulpklassen die in dit onderwerp worden besprokenOverzicht van kanaalmodel.)

De volgende discussie is gebaseerd op het voorbeeld Transport: UDP .

Een kanaalfactory maken

De UdpChannelFactory afgeleiden van ChannelFactoryBase. Het voorbeeld overschrijft GetProperty om toegang te bieden tot de berichtversie van de berichtcoderingsprogramma. Het voorbeeld overschrijft OnClose ook om het exemplaar te verwijderen van BufferManager wanneer de statusmachine overgaat.

Het UDP-uitvoerkanaal

De UdpOutputChannel implementaties IOutputChannel. De constructor valideert de argumenten en bouwt een doelobject EndPoint op basis van de EndpointAddress doorgegeven object.

Met de onderdrukking wordt OnOpen een socket gemaakt die wordt gebruikt om berichten naar dit EndPointbestand te verzenden.

this.socket = new Socket(  
this.remoteEndPoint.AddressFamily,
  SocketType.Dgram,
  ProtocolType.Udp
);  

Het kanaal kan correct of geforceerd worden gesloten. Als het kanaal correct is gesloten, wordt de socket gesloten en wordt er een aanroep uitgevoerd naar de basisklassemethode OnClose . Als dit een uitzondering genereert, roept de infrastructuur Abort aan om ervoor te zorgen dat het kanaal wordt opgeschoond.

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

Implementeren Send() en BeginSend()/EndSend(). Dit is onderverdeeld in twee hoofdsecties. Serialiseer eerst het bericht in een bytematrix:

ArraySegment<byte> messageBuffer = EncodeMessage(message);  

Verzend vervolgens de resulterende gegevens op de kabel:

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

Zie ook