Aracılığıyla paylaş


Müşteri: Kanal Fabrikaları ve Kanallar

Bu konu başlığında kanal fabrikalarının ve kanalların oluşturulması ele alınmaktadır.

Kanal Fabrikaları ve Kanallar

Kanal fabrikaları kanal oluşturmakla sorumludur. Kanal fabrikaları tarafından oluşturulan kanallar ileti göndermek için kullanılır. Bu kanallar, iletiyi yukarıdaki katmandan almaktan, gerekli işlemeyi gerçekleştirmekten ve ardından iletiyi aşağıdaki katmana göndermekten sorumludur. Aşağıdaki grafikte bu işlem gösterilmektedir.

İstemci Fabrikaları ve Kanallar
Kanal fabrikası kanallar oluşturur.

Kapatıldığında, kanal fabrikaları oluşturdukları ve henüz kapatılmayan tüm kanalları kapatmakla sorumludur. Burada modelin asimetrik olduğunu unutmayın çünkü bir kanal dinleyicisi kapatıldığında yalnızca yeni kanalları kabul etme işlemini durdurur, ancak iletileri almaya devam edebilmeleri için mevcut kanalları açık bırakır.

WCF, bu işlem için temel sınıf yardımcıları sağlar. (Bu konuda ele alınan kanal yardımcı sınıflarının diyagramı için bkz. Kanal Modeline Genel Bakış.)

Aşağıdaki tartışma, Aktarım: UDP örneğini temel alır.

Kanal Fabrikası Oluşturma

UdpChannelFactory, ChannelFactoryBase'den türetilir. İleti kodlayıcısının sürümüne erişim sağlamak için örnek GetProperty'ü aşar. Örnek ayrıca, durum makinesi geçiş yaparken örneğimizi OnClose sonlandırmak için BufferManager'ı geçersiz kılar.

UDP Çıkış Kanalı

UdpOutputChannel IOutputChannel uygular. Oluşturucu, bağımsız değişkenleri doğrular ve iletilen EndPoint öğesine göre bir hedef EndpointAddress nesnesi oluşturur.

OnOpen iptali, bu EndPoint öğesine mesaj göndermek için kullanılan bir soket oluşturur.

this.socket = new Socket(  
this.remoteEndPoint.AddressFamily,
  SocketType.Dgram,
  ProtocolType.Udp
);  

Kanal zarif bir şekilde veya zarif olmayan bir şekilde kapatılabilir. Kanal düzgün bir şekilde kapatılırsa yuva kapatılır ve temel sınıf OnClose yöntemine bir çağrı yapılır. Bu bir özel durum oluşturursa, altyapı Abort'yi çağırır ki kanal temizlenmiş olsun.

this.socket.Close();  
base.OnClose(timeout);  

Send() ve BeginSend()/EndSend() uygula. Bu iki ana bölüme ayrılır. önce iletiyi bir bayt dizisine seri hale getirme:

ArraySegment<byte> messageBuffer = EncodeMessage(message);  

Ardından elde edilen verileri kabloya gönderin:

this.socket.SendTo(  
  messageBuffer.Array,
  messageBuffer.Offset,
  messageBuffer.Count,
  SocketFlags.None,
  this.remoteEndPoint  
);  

Ayrıca bakınız