Udostępnij za pośrednictwem


Klient: Fabryki kanałów i kanały

W tym temacie omówiono tworzenie fabryk kanałów i samych kanałów.

Fabryki kanałów i kanały

Fabryki kanałów są odpowiedzialne za tworzenie kanałów. Kanały tworzone przez fabryki kanałów służą do wysyłania komunikatów. Te kanały są odpowiedzialne za pobranie komunikatu z powyższej warstwy, wykonanie dowolnego przetwarzania, a następnie wysłanie komunikatu do warstwy poniżej. Poniższa ilustracja ilustruje ten proces.

Fabryki i kanały klienta
Fabryka kanałów tworzy kanały.

Po zamknięciu fabryki kanałów są odpowiedzialne za zamknięcie wszystkich utworzonych kanałów, które nie zostały jeszcze zamknięte. Należy pamiętać, że model jest tutaj asymetryczny, ponieważ gdy odbiornik kanału jest zamknięty, zatrzymuje akceptowanie nowych kanałów, ale pozostawia otwarte istniejące kanały, aby mogły kontynuować odbieranie komunikatów.

Program WCF udostępnia pomocników klasy bazowej dla tego procesu. (Aby uzyskać diagram klas pomocnika kanału omówionych w tym temacie, zobacz Omówienie modelu kanału).

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

Tworzenie fabryki kanałów

UdpChannelFactory pochodzi z ChannelFactoryBase. Przykład nadpisuje GetProperty, aby zapewnić dostęp do wersji komunikatu dekodera. Przykład również nadpisuje OnClose aby usunąć nasze wystąpienie BufferManager , gdy maszyna stanowa dokonuje przejść.

Kanał wyjściowy UDP

Element UdpOutputChannel implementuje IOutputChannel. Konstruktor weryfikuje argumenty i konstruuje obiekt docelowy EndPoint na podstawie przekazanego EndpointAddress obiektu.

Zastąpienie OnOpen tworzy gniazdo używane do wysyłania komunikatów do tego EndPoint.

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

Kanał można zamknąć z wdziękiem lub niegrzecznie. Jeśli kanał jest zamknięty bezpiecznie, gniazdo jest zamknięte i wywołanie jest wykonywane do metody klasy OnClose bazowej. Jeśli zgłosi to wyjątek, infrastruktura wywołuje Abort w celu upewnienia się, że kanał zostanie oczyszczony.

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

Zaimplementuj Send() i BeginSend()/EndSend(). Jest to podzielone na dwie główne sekcje. Najpierw serializuj komunikat do tablicy bajtów:

ArraySegment<byte> messageBuffer = EncodeMessage(message);  

Następnie wyślij wynikowe dane na przewodzie:

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

Zobacz także