2010-05-19 9 views
2

Comme writen dans mon titre,WCF comment détecter client existency

fond: J'ai deux différents types d'applications (WPF-silverlight) qui peuvent parler entre eux - l'application médecin et demande du patient - mais il n'a pas signifie que seulement 2 applications seront exécutées, par exemple: Je peux exécuter 3 application médecin et 7 application patient. et toutes ces applications communiquent en utilisant wcf via une connexion tcp. la communication est en temps réel (comme application de messagerie)

flux chaque fois qu'il ya un i enregistrer sa connexion application en ligne (run) à WCF, parce que je dois laisser les autres applications savent (temps réel) il y a nouveau client connecté ou il y a un nouveau client déconnecté.

problème: il est bien de laisser l'autre application savoir qu'il ya, de l'application/client entrant, mais mon problème est, comment laisser l'autre application savoir si ce client a été déconnecté,

il est très bien si l'utilisateur ferme l'application correctement (par exemple cliquez sur le bouton de fermeture) - donc dans wpf, je peux appeler le wcf pour annuler l'inscription,

mais comment si la connexion était terminée anormale (par exemple, débranchez directement le câble d'alimentation de votre PC) Y at-il un moyen pour moi de connaître ce client encore connecté ou non?

je réalise ce problème quand je pres f5 dans mon VS2008 et fermez, et ouvrez à nouveau et fermez (répété) et puis, quand je débogue, il y a beaucoup de connexion est encore stockée là mais le client est déjà détruit.

alors quelqu'un a-t-il connu cette meilleure solution? exemple est très apprécié

mon extrait de code:

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; 
    } 

Merci à l'avance

Répondre

1

Je pense que vous avez vraiment besoin de mettre en œuvre un service éditeur/abonné. Toutes les applications du médecin et des patients ont un lien vers le pub/service secondaire. Lorsqu'une application démarre, elle s'abonne au service et commence à recevoir des notifications de toutes les autres applications. Lorsqu'une application se ferme, elle se désinscrit des événements.

Jetez un oeil à ceci: http://msdn.microsoft.com/en-us/library/ms752254.aspx

et ceci: http://msdn.microsoft.com/en-us/magazine/cc163537.aspx