Question

J'ai suivi Pub / sous échantillon en utilisant le canal WCF duplex interrogation HTTP mais j'ai remarqué que lorsqu'un client se déconnecte en fermant le navigateur le service ne avis sur le rappel suivant. Je me serais attendu à une exception ou quelque chose à dire que le critère d'évaluation n'a pas été là plus longtemps.

Comment pouvez-vous savoir quand un client est parti, de façon à arrêter la publication à ce client?

Était-ce utile?

La solution

Il semble qu'il y ait un peu satisfaisant, mais solution simple. Si les temps de rappel du client sur, ne pas appeler à nouveau

Dans mon système, je l'ai également mis en œuvre un appel « contrôle » manuel - tous les n secondes le serveur appelle une méthode sans paramètre sur le canal de rappel pour chaque client enregistré, juste pour voir si le client est toujours là. Je commence à me demander si cela était vraiment une bonne idée -. J'ai un nouveau problème où un délai d'attente de rappel parce que je garde se produit le client ai suspendu dans le débogueur

Autres conseils

Pour en être sûr: impossible .

Quand une connexion TCP est fermé (sous-jacent un appel HTTP), un message TCP spécial est envoyé au serveur - paquet FIN. Bien que HTTP est sans état, sous-jacente connexion TCP est stateful et maintenir en vie, sous-jacente connexion TCP reste généralement ouvert. Si le client est disposé, la connexion TCP est fermée et normalement un message envoyé au serveur. Mais si elle se bloque ou son réseau est déconnecté, il ne serait pas le temps de le faire. Donc, en un mot, vous ne pouvez jamais être sûr.

pour plus d'informations.

Il est difficile, presque impossible (cause des capacités duplex SL limitée). nous avons mis en place une liste d'utilisateurs dans notre service, et nous avons ajouté une propriété « IsDisconnected » et LastCommunicationTime, une fois le service WCF obtient un délai d'attente lorsque tente d'ajouter un message dans sortant-message-File d'attente de l'utilisateur, et échoue, et jette une exception de délai d'attente. nous marquons « IsDisconnecte = true » et la prochaine fois ne pas essayer d'envoyer le message à cet utilisateur.

Un autre fil continue de regarder cela et si elle remarque que le LastCommunicationTime a été dépassée par une valeur de temps et IsDisconnected = true, il supprime l'utilisateur de la liste, à moins que les mêmes utilisateur essaie de se connecter à nouveau dans cette période (que nous identifions par son UserId).

Il y a tellement de choses que nous avons à gérer manuellement ce problème car il faisait le service WCF tellement occupé.

Je fait face à ce problème et a créé un fil qui élimine les clients déconnectés avec le code suivant. Il fonctionne très bien, mais laisse tomber le client déconnecté de la liste des clients après 10-15 minutes (ce qui était ok pour moi).

    new Thread(new ThreadStart(() =>
    {
        while (SilverlightClients != null)
        {
                lock (SilverlightClients)
                {
                    SilverlightClients = SilverlightClients.Where(d => (d.Callback as IContextChannel).State != CommunicationState.Opened).ToList();
                }

            Thread.Sleep(1000);
        }
    })) { Name = "Thread Remove Disconnected Clients" }.Start();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top