Klient: Objekty pro vytváření kanálů a kanály
Toto téma popisuje vytváření kanálů továren a kanálů.
Objekty pro vytváření kanálů a kanály
Objekty pro vytváření kanálů zodpovídají za vytváření kanálů. Kanály vytvořené továrnami kanálů se používají k odesílání zpráv. Tyto kanály zodpovídají za získání zprávy z výše uvedené vrstvy, provádění jakéhokoli zpracování a následné odeslání zprávy do níže uvedené vrstvy. Tento proces znázorňuje následující obrázek.
Kanálová továrna vytváří kanály.
Při zavření jsou objekty pro vytváření kanálů zodpovědné za zavření všech kanálů, které ještě nejsou zavřené. Všimněte si, že model je tady asymetrický, protože když je naslouchací proces kanálu zavřený, přestane přijímat nové kanály, ale ponechá stávající kanály otevřené, aby mohly pokračovat v přijímání zpráv.
WCF poskytuje pomocné rutiny základní třídy pro tento proces. (Diagram pomocných tříd kanálu probíraných v tomto tématu najdete v tématu Přehled modelu kanálu.)
Třída CommunicationObject implementuje a vynucuje ICommunicationObject stavový počítač popsaný v kroku 2 vývoje kanálů.
Třída ChannelManagerBase implementuje CommunicationObject a poskytuje jednotnou základní třídu pro System.ServiceModel.Channels.ChannelFactoryBase a System.ServiceModel.Channels.ChannelListenerBase. Třída ChannelManagerBase funguje ve spojení s ChannelBase, což je základní třída, která implementuje IChannel.
Třída ChannelFactoryBase implementuje ChannelManagerBase a IChannelFactory konsoliduje
CreateChannel
přetížení do jednéOnCreateChannel
abstraktní metody.Třída ChannelListenerBase implementuje IChannelListener. Stará se o základní správu stavu.
Následující diskuze vychází z ukázky Transport: UDP .
Vytvoření objektu pro vytváření kanálů
Odvozeno UdpChannelFactory
od ChannelFactoryBase. Ukázka přepisuje GetProperty , aby poskytovala přístup ke verzi zprávy kodéru zpráv. Ukázka také přepíše OnClose , aby se naše instance BufferManager při přechodu stavového počítače odbourá.
Výstupní kanál UDP
Implementuje UdpOutputChannel
IOutputChannel. Konstruktor ověří argumenty a vytvoří cílový EndPoint objekt na základě předaného objektu EndpointAddress .
Přepsání OnOpen vytvoří soket, který se používá k odesílání zpráv do této EndPoint.
this.socket = new Socket(
this.remoteEndPoint.AddressFamily,
SocketType.Dgram,
ProtocolType.Udp
);
Kanál může být elegantně uzavřen nebo nedrželně. Pokud je kanál uzavřen elegantně, soket je uzavřen a volání je provedeno metodu základní třídy OnClose
. Pokud dojde k výjimce, volání Abort
infrastruktury, aby se zajistilo vyčištění kanálu.
this.socket.Close();
base.OnClose(timeout);
Implementace Send()
a BeginSend()
/EndSend()
. Rozdělí se do dvou hlavních částí. Nejprve serializujte zprávu do bajtového pole:
ArraySegment<byte> messageBuffer = EncodeMessage(message);
Pak na drátu odešlete výsledná data:
this.socket.SendTo(
messageBuffer.Array,
messageBuffer.Offset,
messageBuffer.Count,
SocketFlags.None,
this.remoteEndPoint
);