Ich implementiere eine Session-Struktur.So gehen Sie mit der offenen Sitzung um
Ich habe eine ConcurrentDictionary
auf der Serverseite an alle <SessionId, UserSession>
Paare halten.
Wenn eine neue Verbindung hergestellt wird, wird je nach der RememberMe
Option ein Cookie einem Client-Browser, perm oder temp zugewiesen.
Wenn Clients die LogOut
Funktion aufrufen, wird die Sitzung aus dem Wörterbuch entfernt.
Wenn jedoch der Client-Browser einfach geschlossen oder abgestürzt ist und ein Cookie verloren gegangen oder abgelaufen oder gelöscht wurde, verbleibt das serverseitige Sitzungsobjekt im Speicher im Wörterbuch und wird zu einem Ghost. Mit der Zeit werden sich diese Geister stapeln.
Meine Frage ist, wie man das Design verbessert, so dass die toten Sitzungen nach Ablauf gelöscht werden können?
Ich dachte daran, einen Timer-Dienst zu machen, der einen Reinigungsplan ausführt, aber es fühlt sich nicht elegant an. Gibt es eine einfachere Möglichkeit, dies zu tun, ohne von einem externen Dienst abhängig zu sein?
Es wäre besser, einen Cache mit einem rollenden Begriff zu verwenden oder die Session_End-Methode zu behandeln. Was speichern Sie in UserSession? – zimdanen
Es gibt keine zuverlässige Session_End-Methode, die behandelt werden kann, wenn der Client-Browser abstürzt, dann endet er einfach dort, ohne zurück zum Server zu sprechen. Aber jetzt, wo du einen Cache erwähnt hast, habe ich eine Idee, ich kann eine Liste nach LastActive Zeit speichern. Immer wenn sich ein neuer Client anmeldet, kann er helfen, die früheste Sitzung in der Warteschlange zu überprüfen und zu entfernen, wenn sie abgelaufen ist. Jeder aktive Benutzer wird sich selbst in den hinteren Bereich der Warteschlange stellen, wenn er den Server anruft, um etwas zu tun. So wird er zur neuesten aktiven Person. – Tom
Müssen Sie irgendwann Daten über alle eingeloggten Benutzer sehen? Wenn nicht, dann speichern Sie Ihre Daten einfach in der Sitzung (wenn Sie die Daten benötigen) und lassen Sie sie nach Ablauf der Sitzung wieder verschwinden. Das wird den Speicherdruck auch durch das Auslassen von Elementen aus der Sitzung bewältigen, wenn Druck besteht. Oder verwenden Sie HttpContext.Cache mit einem rollenden Timeout, sodass es nach einer festgelegten Zeit nach dem letzten Zugriff wieder verschwindet. (Im Prinzip keine Notwendigkeit, eigene zu rollen.) – zimdanen