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.
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).
Klasa CommunicationObject implementuje ICommunicationObject i wymusza maszynę stanu opisaną w kroku 2 kanałów programowania.
Klasa ChannelManagerBase implementuje CommunicationObject i udostępnia ujednoliconą klasę bazową dla elementów System.ServiceModel.Channels.ChannelFactoryBase i System.ServiceModel.Channels.ChannelListenerBase. Klasa ChannelManagerBase działa w połączeniu z klasą ChannelBase, która jest klasą bazową, która implementuje IChannelelement .
Klasa ChannelFactoryBase implementuje ChannelManagerBase i IChannelFactory konsoliduje
CreateChannel
przeciążenia w jednąOnCreateChannel
metodę abstrakcyjną.Klasa ChannelListenerBase implementuje IChannelListenerelement . Zajmuje się podstawowym zarządzaniem stanem.
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 UdpOutputChannel
IOutputChannel. 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
);