Udostępnij za pośrednictwem


Klient: Fabryki kanałów i kanały

W tym temacie omówiono tworzenie fabryk kanałów i 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.

Client Factories and Channels
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

Element UdpChannelFactory pochodzi z klasy ChannelFactoryBase. Przykładowe GetProperty zastąpienia w celu zapewnienia dostępu do wersji komunikatu kodera komunikatów. Przykład zastępuje OnClose również nasze wystąpienie BufferManager , gdy maszyna stanu przechodzi.

Kanał wyjściowy UDP

Implementuje element UdpOutputChannelIOutputChannel. Konstruktor weryfikuje argumenty i konstruuje obiekt docelowy EndPoint na podstawie przekazanego EndpointAddress obiektu.

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

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, wywołania Abort infrastruktury 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 też