2010-05-19 107 views
2

正如我標題writen,WCF如何檢測客戶端existency

背景: 我有2個不同類型的應用程序(WPF,Silverlight的),它可以跟對方 - 醫生應用程序和患者應用程序 - 但事實並非如此意味着只有2個應用程序可以運行,例如: 我可以運行3個醫生應用程序和7個患者應用程序。 和所有這些應用程序是通過TCP連接使用wcf進行通信。 通信是實時的(如Messenger應用)

流 每次有一個應用程序在線(運行)我註冊其在WCF連接,因爲我需要讓其他應用程序知道(實時)有連接新客戶端或有新客戶斷開連接。

問題: 它的罰款,讓其他應用程序知道有入局應用程序/客戶端, 但我的問題是,如何讓其他應用程序知道這個客戶端斷開連接,

這很好,如果用戶關閉應用程序(例如,單擊關閉按鈕) - 所以在wpf中,我可以調用wcf來取消註冊連接,但是如果連接終止異常(例如,直接拔下PC的電源電纜) 有沒有什麼辦法讓我知道這個客戶端仍然連接?

我意識到這個問題,當我壓我的VS2008 f5和關閉,再次打開並關閉(重複),然後,當我調試,有很多的連接仍然存儲在那裏,但實際上客戶端已被破壞。

有人知道這個最好的解決方案嗎? 例子是非常讚賞

我的代碼片段:

Dictionary<Guid, Client> Connections = new Dictionary<Guid, Client>(); 
// above is the variable where i put the connections 
    object syncObj = new object(); 

    public ITcpServiceCallback CurrentCallback { get { return OperationContext.Current.GetCallbackChannel<ITcpServiceCallback>(); } } 

    // this function is called when the program started 
    public List<Client> ShakeHand(Client client, RoleType appType) { 
     if(GetClientsByCallback(CurrentCallback).Count < 1 && GetClientsByID(client.ID).Count < 1) { 
      List<Client> retVal = new List<Client>(); 
      lock(syncObj) { 
       if(appType == RoleType.Doctor) { 
        List<Client> doctors = Helpers.GetDoctor(AppDomain.CurrentDomain.BaseDirectory + "App_Data/doctor.xml"); 
        foreach(Client doctor in doctors) { 
         doctor.Status = ConnectionStatus.Offline; 
         foreach(Client con in Connections.Values) { 
          if(con.Role == RoleType.Doctor && con.ID == doctor.ID) { 
           doctor.Status = ConnectionStatus.Online; 
           break; 
          } 
         } 
         retVal.Add(doctor); 
        } 
       } else { //b la.. bla similiar like if above 
       } 

       client.Callback = CurrentCallback; 
       client.Status = ConnectionStatus.Online; 

       // this is the code where i add the connection 
       Connections.Add(Guid.NewGuid(), client); 

      } 
      return retVal; 
     } 
     return null; 
    } 

預先感謝您

回答