Usługa: odbiorniki kanału i kanały

Istnieją trzy kategorie obiektów kanałów: kanały, odbiorniki kanałów i fabryki kanałów. Kanały to interfejs między aplikacją a stosem kanału. Odbiorniki kanału są odpowiedzialne za tworzenie kanałów po stronie odbierania (lub nasłuchiwania), zazwyczaj w odpowiedzi na nowy przychodzący komunikat lub połączenie. Fabryki kanałów są odpowiedzialne za tworzenie kanałów po stronie wysyłania w celu zainicjowania komunikacji z punktem końcowym.

Odbiorniki kanału i kanały

Odbiorniki kanału są odpowiedzialne za tworzenie kanałów i odbieranie komunikatów z warstwy poniżej lub z sieci. Odebrane komunikaty są dostarczane do powyższej warstwy przy użyciu kanału utworzonego przez odbiornik kanału.

Na poniższym diagramie przedstawiono proces odbierania komunikatów i dostarczania ich do powyższej warstwy.

Channel listeners and channels

Odbiornik kanału odbiera komunikaty i dostarcza do warstwy powyżej za pośrednictwem kanałów.

Proces można modelować koncepcyjnie jako kolejkę wewnątrz każdego kanału, chociaż implementacja może nie używać kolejki. Odbiornik kanału jest odpowiedzialny za odbieranie komunikatów z warstwy poniżej lub sieci i umieszczanie ich w kolejce. Kanał jest odpowiedzialny za pobieranie komunikatów z kolejki i przekazywanie ich do warstwy powyżej, gdy ta warstwa prosi o komunikat, na przykład przez wywołanie Receive kanału.

Program WCF udostępnia pomocników klasy bazowej dla tego procesu. Aby zapoznać się z diagramem klas pomocnika kanału omówionych w tym artykule, zobacz Channel Model Overview (Omówienie modelu kanału).

Poniższa dyskusja opiera się na przykładzie Transport: UDP .

Tworzenie odbiornika kanału

Przykład UdpChannelListener implementuje pochodną ChannelListenerBase klasy . Używa pojedynczego gniazda UDP do odbierania datagramów. Metoda OnOpen odbiera dane przy użyciu gniazda UDP w pętli asynchronicznej. Dane są następnie konwertowane na komunikaty przy użyciu systemu kodowania komunikatów:

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

Ponieważ ten sam kanał datagramu reprezentuje komunikaty pochodzące z wielu źródeł, UdpChannelListener jest to pojedynczy odbiornik. W danym momencie istnieje co najwyżej jeden aktywny IChannel skojarzony z tym odbiornikiem. Przykład generuje inny tylko wtedy, gdy kanał zwracany przez metodę AcceptChannel jest następnie usuwany. Po odebraniu komunikatu jest on umieszczany w kolejce do tego kanału pojedynczego.

UdpInputChannel

Klasa UdpInputChannel implementuje IInputChannelelement . Składa się z kolejki komunikatów przychodzących wypełnianych przez UdpChannelListenergniazdo . Te komunikaty są dequeued przez metodę Receive .