Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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.
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 obsługuje maszynę stanów opisaną w kroku 2 Developing Channels.
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 bazową i implementuje IChannel.
Klasa ChannelFactoryBase implementuje ChannelManagerBase i IChannelFactory konsoliduje
CreateChannel
przeciążenia w jednąOnCreateChannel
metodę abstrakcyjną.Klasa ChannelListenerBase implementuje IChannelListener. Zajmuje się podstawowym zarządzaniem stanem.
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
);