Klient: Kanalfabriker och kanaler
I det här avsnittet beskrivs hur du skapar kanalfabriker och kanaler.
Kanalfabriker och kanaler
Kanalfabriker ansvarar för att skapa kanaler. Kanaler som skapats av kanalfabriker används för att skicka meddelanden. Dessa kanaler ansvarar för att hämta meddelandet från lagret ovan, utföra den bearbetning som krävs och sedan skicka meddelandet till lagret nedan. Följande bild illustrerar den här processen.
En kanalfabrik skapar kanaler.
När de stängs ansvarar kanalfabriker för att stänga alla kanaler som de har skapat och som ännu inte är stängda. Observera att modellen är asymmetrisk här eftersom när en kanallyssnare stängs slutar den bara att acceptera nya kanaler men lämnar befintliga kanaler öppna så att de kan fortsätta att ta emot meddelanden.
WCF tillhandahåller basklasshjälp för den här processen. (Ett diagram över kanalhjälpklasserna som beskrivs i det här avsnittet finns iÖversikt över kanalmodell.)
Klassen CommunicationObject implementerar ICommunicationObject och tillämpar tillståndsdatorn som beskrivs i steg 2 i Utveckla kanaler.
Klassen ChannelManagerBase implementerar CommunicationObject och tillhandahåller en enhetlig basklass för System.ServiceModel.Channels.ChannelFactoryBase och System.ServiceModel.Channels.ChannelListenerBase. Klassen ChannelManagerBase fungerar tillsammans med ChannelBase, vilket är en basklass som implementerar IChannel.
Klassen ChannelFactoryBase implementerar ChannelManagerBase och IChannelFactory konsoliderar överbelastningarna
CreateChannel
till enOnCreateChannel
abstrakt metod.Klassen ChannelListenerBase implementerar IChannelListener. Den tar hand om grundläggande tillståndshantering.
Följande diskussion baseras på exemplet Transport: UDP .
Skapa en kanalfabrik
Härleds UdpChannelFactory
från ChannelFactoryBase. Exemplet åsidosätter GetProperty för att ge åtkomst till meddelandeversionen av meddelandekodaren. Exemplet åsidosätter OnClose också för att ta bort vår instans av BufferManager när tillståndsdatorn övergår.
UDP-utdatakanalen
Implementerar UdpOutputChannel
IOutputChannel. Konstruktorn validerar argumenten och konstruerar ett målobjekt EndPoint baserat på EndpointAddress det som skickas in.
Åsidosättningen av OnOpen skapar en socket som används för att skicka meddelanden till den här EndPoint.
this.socket = new Socket(
this.remoteEndPoint.AddressFamily,
SocketType.Dgram,
ProtocolType.Udp
);
Kanalen kan stängas graciöst eller ospårbart. Om kanalen stängs korrekt stängs socketen och ett anrop görs till basklassmetoden OnClose
. Om detta utlöser ett undantag anropar Abort
infrastrukturen för att säkerställa att kanalen rensas.
this.socket.Close();
base.OnClose(timeout);
Implementera Send()
och BeginSend()
/EndSend()
. Detta delas upp i två huvudavsnitt. Serialisera först meddelandet till en bytematris:
ArraySegment<byte> messageBuffer = EncodeMessage(message);
Skicka sedan resulterande data på tråden:
this.socket.SendTo(
messageBuffer.Array,
messageBuffer.Offset,
messageBuffer.Count,
SocketFlags.None,
this.remoteEndPoint
);