Frage

Ich habe Tomek Janczuk des gefolgt Pub / sub Beispiel HTTP Polling Duplex WCF-Kanal aber ich habe bemerkt, dass, wenn ein Client die Verbindung trennt durch Schließen des Browsers der Dienst auf dem nächsten Rückruf nicht bemerkt hat. Ich hätte eine Ausnahme oder etwas erwartet zu sagen, dass der Endpunkt nicht dort mehr war.

Wie kann man wissen, wenn ein Client gegangen ist, um zu diesem Client zu veröffentlichen zu stoppen?

War es hilfreich?

Lösung

Es scheint, gibt es eine unbefriedigende, wenn auch einfache Lösung. Wenn die Client-Rückruf-mal aus, Sie es nicht wieder anrufen

In meinem System hat ich auch einen manuellen „check“ Aufruf implementiert - all n Sekunden der Server ruft eine parameterlos Methode über den Callback-Kanal für jeden registrierten Client, nur um zu sehen, ob der Client noch da. Ich fange an zu fragen, ob das wirklich eine gute Idee war. - Ich habe ein neues Problem bekommt, wo ein Callback-Timeout auftrat hält, weil ich den Client im Debugger suspendiert habe

Andere Tipps

Um sicher zu sein: unmöglich .

Wenn eine TCP-Verbindung geschlossen ist (einen HTTP-Aufruf zugrunde liegen), eine spezielle TCP-Nachricht wird an den Server gesendet - FIN-Paket. Obwohl HTTP staatenlos ist, TCP-Verbindung zugrunde liegende Stateful und mit keep alive, TCP-Verbindung zugrunde liegen in der Regel offen bleibt. Wenn Client angeordnet ist, ist TCP-Verbindung geschlossen und normalerweise eine Nachricht an den Server gesendet. Aber wenn er abstürzt oder sein Netzwerk getrennt wird, wäre es nicht die Zeit haben, dies zu tun. So in einem Wort kann man nie sicher sein.

Hier für weitere Informationen.

Es ist schwer, fast unmöglich, (Ursache der begrenzten SL Duplex-Fähigkeiten). Wir haben eine Liste von Benutzern in unserem Dienst implementiert, und wir haben eine Eigenschaft „IsDisconnected“ und LastCommunicationTime hinzugefügt, sobald WCF-Dienst bekommt einen Timeout, wenn versucht, eine Nachricht in Benutzer-Outgoing-Nachrichten-Warteschlange hinzuzufügen, und schlägt fehl und löst eine Ausnahme die Timeout. markieren wir „IsDisconnecte = true“ und beim nächsten Mal versuchen, die Nachricht nicht an den Benutzer zu senden.

Ein anderer Thread hält an, dass suchen und wenn sie feststellen, dass der LastCommunicationTime wird von einem Wert von Zeit und IsDisconnected = true überschritten worden ist, entfernt es den Benutzer aus der Liste, es sei denn, die gleichen Benutzer versucht, innerhalb dieser Zeit wieder verbunden werden (welche identifizieren wir durch seine Benutzer-ID).

Es gibt so viele Dinge, die wir manuell um dieses Problem zu umgehen taten, wie es den WCF-Dienst machte so viel beschäftigt.

ich dieses Problem konfrontiert und erstellt einen Thread, der entfernt getrennt Clients mit dem folgenden Code. Es funktioniert gut, aber fällt das getrennte Client aus der Client-Liste nach 10-15 Minuten (was für mich in Ordnung war).

    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();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top