Služba: Naslouchací procesy kanálů a kanály
Existují tři kategorie objektů kanálu: kanály, naslouchací procesy kanálů a továrny kanálů. Kanály jsou rozhraní mezi aplikací a zásobníkem kanálů. Naslouchací procesy kanálu zodpovídají za vytváření kanálů na straně příjmu (nebo naslouchání), obvykle v reakci na novou příchozí zprávu nebo připojení. Objekty pro vytváření kanálů na straně odesílání zodpovídají za zahájení komunikace s koncovým bodem.
Naslouchací procesy a kanály kanálu
Naslouchací procesy kanálu zodpovídají za vytváření kanálů a příjem zpráv z níže uvedené vrstvy nebo ze sítě. Přijaté zprávy se doručují do výše uvedené vrstvy pomocí kanálu vytvořeného naslouchacím procesem kanálu.
Následující diagram znázorňuje proces příjmu zpráv a jejich doručování do výše uvedené vrstvy.
Naslouchací proces kanálu přijímá zprávy a doručuje do vrstvy nad kanály.
Proces může být koncepčně modelován jako fronta uvnitř každého kanálu, i když implementace nemusí ve skutečnosti používat frontu. Naslouchací proces kanálu zodpovídá za příjem zpráv z vrstvy pod nebo ze sítě a jejich umístění do fronty. Kanál zodpovídá za získávání zpráv z fronty a jejich předání do výše uvedené vrstvy, když tato vrstva požádá o zprávu, například voláním Receive
do kanálu.
WCF poskytuje pomocné rutiny základní třídy pro tento proces. Diagram pomocných tříd kanálu probíraných v tomto článku najdete v tématu Přehled modelu kanálu.
Třída CommunicationObject implementuje a vynucuje ICommunicationObject stavový počítač popsaný v kroku 2 vývoje kanálů.
Třída ChannelManagerBase implementuje CommunicationObject a poskytuje jednotnou základní třídu pro ChannelFactoryBase a ChannelListenerBase. Třída ChannelManagerBase funguje ve spojení s ChannelBase, což je základní třída, která implementuje IChannel.
Třída ChannelFactoryBase implementuje ChannelManagerBase a IChannelFactory konsoliduje
CreateChannel
přetížení do jednéOnCreateChannel
abstraktní metody.Třída ChannelListenerBase implementuje IChannelListener. Stará se o základní správu stavu.
Následující diskuze vychází z ukázky Transport: UDP .
Vytvoření naslouchacího procesu kanálu
Ukázka UdpChannelListener
implementuje odvození z ChannelListenerBase třídy. K příjmu datagramů používá jeden soket UDP. Metoda OnOpen
přijímá data pomocí soketu UDP v asynchronní smyčce. Data se pak převedou na zprávy pomocí systému kódování zpráv:
message = UdpConstants.MessageEncoder.ReadMessage(
new ArraySegment<byte>(buffer, 0, count),
bufferManager
);
Vzhledem k tomu, že stejný kanál datagramu představuje zprávy, které přicházejí z řady zdrojů, jedná se UdpChannelListener
o jeden naslouchací proces. K tomuto naslouchacímu procesu je současně přidruženo maximálně jedno aktivní IChannel . Ukázka vygeneruje další pouze v případě, že se následně odstraní kanál vrácený metodou AcceptChannel . Když se zpráva přijme, začtou se do tohoto jednoúčelového kanálu.
UdpInputChannel
Třída UdpInputChannel
implementuje IInputChannel. Skládá se z fronty příchozích zpráv naplněných soketem UdpChannelListener
. Tyto zprávy jsou vyřazeny z fronty metodou Receive .