Dela via


Tjänst: Kanallyssnare och kanaler

Det finns tre kategorier av kanalobjekt: kanaler, kanallyssnare och kanalfabriker. Kanaler är gränssnittet mellan programmet och kanalstacken. Kanallyssnare ansvarar för att skapa kanaler på mottagarsidan (eller lyssna), vanligtvis som svar på ett nytt inkommande meddelande eller en ny anslutning. Kanalfabriker ansvarar för att skapa kanaler på sändningssidan för att initiera kommunikation med en slutpunkt.

Kanallyssnare och kanaler

Kanallyssnare ansvarar för att skapa kanaler och ta emot meddelanden från lagret nedan eller från nätverket. Mottagna meddelanden levereras till lagret ovan med hjälp av en kanal som skapas av kanallyssnaren.

Följande diagram illustrerar processen för att ta emot meddelanden och leverera dem till lagret ovan.

Channel listeners and channels

En kanallyssnare tar emot meddelanden och levererar till lagret ovan via kanaler.

Processen kan modelleras konceptuellt som en kö i varje kanal, även om implementeringen kanske inte använder en kö. Kanallyssnaren ansvarar för att ta emot meddelanden från lagret nedan eller nätverket och placera dem i kön. Kanalen ansvarar för att hämta meddelanden från kön och överlämna dem till lagret ovan när det lagret frågar efter ett meddelande, till exempel genom att anropa Receive på kanalen.

WCF tillhandahåller basklasshjälp för den här processen. Ett diagram över kanalhjälpklasserna som beskrivs i den här artikeln finns i Översikt över kanalmodell.

Följande diskussion baseras på exemplet Transport: UDP .

Skapa en kanallyssnare

Det UdpChannelListener som exemplet implementerar härleds från ChannelListenerBase klassen. Den använder en enda UDP-socket för att ta emot datagram. Metoden OnOpen tar emot data med UDP-socketen i en asynkron loop. Data konverteras sedan till meddelanden med hjälp av meddelandekodningssystemet:

message = UdpConstants.MessageEncoder.ReadMessage(
  new ArraySegment<byte>(buffer, 0, count),
  bufferManager
);

Eftersom samma datagramkanal representerar meddelanden som kommer från ett antal källor är UdpChannelListener det en singleton-lyssnare. Det finns högst en aktiv IChannel som är associerad med den här lyssnaren i taget. Exemplet genererar endast en annan om en kanal som returneras av AcceptChannel metoden sedan tas bort. När ett meddelande tas emot placeras det i den här singleton-kanalen.

UdpInputChannel

Klassen UdpInputChannel implementerar IInputChannel. Den består av en kö med inkommande meddelanden som fylls i av socketen UdpChannelListener. Dessa meddelanden är dequeued av Receive metoden.