Sdílet prostřednictvím


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.

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

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 UdpOutputChannelIOutputChannel. 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  
);  

Viz také