2011-09-02 29 views
6

WSDualHttpBinding ile çalışan bir dupleks WCF hizmetim var. Sorunum, geri arama kanalını benzersiz bir kimlikle depolamanın bir yolunu bulmaktır. Hizmetin uzun süredir çalışması amaçlanmıştır. Bir "Abone Ol" yöntemi çağrıldığında ve bir liste veya sözlükte sakladığımda OperationContext.Current.GetCallbackChannel() dönüş değerini alabilir miyim? Bağlantı yaşana kadar geçerli olduğu garanti ediliyor mu?İstemcileri bir WCF hizmetinde tanımlama

cevap

5

En kolay yol, istemcinizin hizmetinizin Abone Olma yönteminde önemli bir değer vermesini sağlamaktır. Ardından, geri arama kanalını bir sözlükte kaydedebilirsiniz. Bu sözlük muhtemelen hizmet sınıfının bir PerCall ömrüne sahip olduğu ve servis çağrısının tamamlanmasından sonra bertaraf edileceği için ömrü Hizmet Sınıfının ömrünün üzerinde olan bir statik değişken veya tek bir sınıf olmak zorundadır. Iş parçacığı sorunları dikkat!

Geri arama kanalı, istemcide veya servis tarafında herhangi bir zamanda arızalanabilir. Hizmet, hatalı bir kanal olasılığını işlemek ve arızalı kanalı sözlükten kaldırmak zorundadır. WSDuallHttpBinding bir "Vatansız" bağlacıdır; bu nedenle, istemcideki herhangi bir arıza, servis tarafı bunları çağırmaya çalışana kadar servis tarafında algılanmaz. İstemci hatalı bir duruma girerse, NetTcpBinding ChannelFaulted olayını yükseltir. Bu nedenle, gereksinimlerinize uyuyorsa NetTcpBinding öğesini öneriyorum.

public bool Subscribe(string id) { 
     ICallback callback = OperationContext.Current.GetCallbackChannel(); 
     if (!_activeCallbackChannels.Contains(id)) { 
      _activeCallbackChannels.Add(id, callback); 
      return true; 
     } 
     else { 
      return false; 
     } 

    } 
İlgili konular