Welches ist der einfachste und unauffälligste Weg, eine ASP.NET-Sitzung am Leben zu erhalten, solange der Benutzer das Browserfenster geöffnet hat? Ist es zeitgesteuerte AJAX-Anrufe? Ich möchte Folgendes verhindern: Manchmal lassen Benutzer ihr Fenster lange offen, geben dann Daten ein und beim Senden funktioniert nichts mehr, da die serverseitige Sitzung abgelaufen ist. Ich möchte den Timeout-Wert nicht länger als 10 Minuten auf dem Server erhöhen, da geschlossene Sitzungen (durch Schließen des Browserfensters) schnell eine Zeitüberschreitung aufweisen sollen.
Vorschläge, Codebeispiele?
Antworten:
Ich verwende JQuery, um einen einfachen AJAX-Aufruf an einen Dummy-HTTP-Handler auszuführen, der nichts anderes tut, als meine Sitzung am Leben zu erhalten:
Der Sitzungshandler kann so einfach sein wie:
Der Schlüssel ist das Hinzufügen von IRequiresSessionState, da sonst die Sitzung nicht verfügbar ist (= null). Der Handler kann natürlich auch ein serialisiertes JSON-Objekt zurückgeben, wenn einige Daten an das aufrufende JavaScript zurückgegeben werden sollen.
Über web.config verfügbar gemacht:
hinzugefügt von balexandre am 14. August 2012
Dieses Beispiel hat mir so gut gefallen, dass ich es mit HTML / CSS und dem Beat-Teil verbessern möchte
ändere das
in
und hinzufügen
HTML und CSS
Hier ist ein Live-Beispiel nur für den schlagenden Teil: http://jsbin.com/ibagob/1/
quelle
DateTime.Now
war nur, um deutlich zu machen, wann die Sitzung zuletzt über den Heartbeat aktualisiert wurde.Wenn Sie ASP.NET MVC verwenden, benötigen Sie keinen zusätzlichen HTTP-Handler und einige Änderungen an der Datei web.config. Alles, was Sie brauchen - nur um eine einfache Aktion in einem Home / Common-Controller hinzuzufügen:
Schreiben Sie einen JavaScript-Code wie diesen (ich habe ihn in eine der JavaScript-Dateien der Site eingefügt):
und initialisieren Sie diese Funktionalität durch Aufrufen einer JavaScript-Funktion:
Bitte beachten Sie! Ich habe diese Funktionalität nur für autorisierte Benutzer implementiert (in den meisten Fällen gibt es keinen Grund, den Sitzungsstatus für Gäste beizubehalten). Die Entscheidung, den Sitzungsstatus aktiv zu halten, basiert nicht nur auf - ist der Browser geöffnet oder nicht, sondern der autorisierte Benutzer muss einige Aktivitäten ausführen auf der Site (bewegen Sie eine Maus oder geben Sie eine Taste ein).
quelle
@Url.Action("KeepSessionAlive","Home")
die Initialisierungsfunktion verwenden, damit Sie die URL nicht fest codieren und den ersten Block in ein IIFE werfen und nur den exportieren müssen,SetupSessionUpdater
da dies das einzige ist, das extern aufgerufen werden muss - so etwas wie dies: SessionUpdater.jssetInterval(KeepSessionAlive, 300000)
Immer wenn Sie eine Anfrage an den Server stellen, wird das Sitzungszeitlimit zurückgesetzt. Sie können also einfach einen Ajax-Aufruf an einen leeren HTTP-Handler auf dem Server senden, aber sicherstellen, dass der Cache des Handlers deaktiviert ist, da sonst der Browser Ihren Handler zwischenspeichert und keine neue Anforderung stellt.
KeepSessionAlive.ashx.cs
.JS:
@veggerby - Der Aufwand für das Speichern von Variablen in der Sitzung ist nicht erforderlich. Es reicht aus, nur eine Anfrage an den Server zu senden.
quelle
Müssen Sie die Sitzung wirklich beibehalten (haben Sie Daten darin?) Oder reicht es aus, dies zu fälschen, indem Sie die Sitzung erneut aktivieren, wenn eine Anfrage eingeht? Verwenden Sie im ersten Fall die oben beschriebene Methode. Wenn dies der zweite Fall ist, versuchen Sie es mit dem Session_End-Ereignishandler.
Wenn Sie über eine Formularauthentifizierung verfügen, erhalten Sie in der Datei Global.asax.cs Folgendes
Und Sie legen die Ticketlebensdauer viel länger als die Sitzungslebensdauer fest. Wenn Sie sich nicht authentifizieren oder eine andere Authentifizierungsmethode verwenden, gibt es ähnliche Tricks. Microsoft TFS-Weboberfläche und SharePoint scheinen diese zu verwenden. Wenn Sie auf einen Link auf einer veralteten Seite klicken, werden im Popup-Fenster Authentifizierungsaufforderungen angezeigt. Wenn Sie jedoch nur einen Befehl verwenden, funktioniert dies.
quelle
Sie können diesen Code einfach in Ihre Java-Skriptdatei schreiben.
Das
(20-1)*60*1000
ist Refresh - Zeit, es wird das Session - Timeout aktualisieren. Das Aktualisierungszeitlimit wird als Standardzeit von iis = 20 Minuten berechnet, dh 20 × 60000 = 1200000 Millisekunden - 60000 Millisekunden (eine Minute vor Ablauf der Sitzung) sind 1140000.quelle
Hier ist eine alternative Lösung, die überleben sollte, wenn der Client-PC in den Ruhemodus wechselt.
Wenn Sie eine große Anzahl angemeldeter Benutzer haben, gehen Sie vorsichtig damit um, da dies viel Serverspeicher beanspruchen kann.
Nachdem Sie sich angemeldet haben (ich mache dies im LoggedIn-Ereignis des Login-Steuerelements)
quelle
Ich habe einige Tage damit verbracht, herauszufinden, wie eine Benutzersitzung in WebForms über ein Popup-Dialogfeld verlängert werden kann, in dem der Benutzer die Möglichkeit hat, die Sitzung zu erneuern oder ablaufen zu lassen. Die Nummer 1, die Sie wissen müssen, ist, dass Sie nichts von diesem ausgefallenen 'HttpContext'-Zeug brauchen, das in einigen der anderen Antworten vor sich geht. Alles was Sie brauchen ist jQuerys $ .post (); Methode. Zum Beispiel habe ich beim Debuggen Folgendes verwendet:
und auf Ihrer Live-Site würden Sie etwas verwenden wie:
So einfach ist das. Wenn Sie den Benutzer mit der Option zur Erneuerung seiner Sitzung auffordern möchten, gehen Sie wie folgt vor:
Vergessen Sie nicht, den Dialog zu Ihrem HTML hinzuzufügen:
quelle
Wenn Sie in Bezug auf die veggerby-Lösung versuchen, sie in einer VB-App zu implementieren, versuchen Sie vorsichtig, den bereitgestellten Code über einen Übersetzer auszuführen. Folgendes wird funktionieren:
Anstatt wie heartbeat () aufzurufen, funktionieren Sie auch wie folgt:
Nennen Sie es stattdessen wie folgt:
Nummer eins, setTimeout wird nur einmal ausgelöst, während setInterval wiederholt ausgelöst wird. Nummer zwei, das Aufrufen von heartbeat () wie ein String hat bei mir nicht funktioniert, während das Aufrufen wie eine tatsächliche Funktion funktioniert hat.
Und ich kann absolut zu 100% bestätigen, dass diese Lösung GoDaddys lächerliche Entscheidung überwinden wird, eine 5-minütige Apppool-Sitzung in Plesk zu erzwingen!
quelle
Hier JQuery Plugin Version der Maryan Lösung mit Handle Optimierung. Nur mit JQuery 1.7+!
und wie es in Ihre * .cshtml importiert
quelle
[Spät zur Party ...]
Eine andere Möglichkeit, dies ohne den Aufwand eines Ajax-Aufrufs oder eines WebService-Handlers zu tun, besteht darin, eine spezielle ASPX-Seite nach einer bestimmten Zeit (dh vor dem Zeitlimit für den Sitzungsstatus, das normalerweise 20 Minuten beträgt) zu laden:
Die
KeepAlive.aspx
Seite ist einfach eine leere Seite, die nur denSession
Status berührt / aktualisiert :Dies funktioniert, indem ein
img
(Bild-) Element erstellt und der Browser gezwungen wird, seinen Inhalt von derKeepAlive.aspx
Seite zu laden . Durch das Laden dieser Seite berührt (aktualisiert) der Server dasSession
Objekt und verlängert das Ablauffenster der Sitzung (normalerweise um weitere 20 Minuten). Der eigentliche Webseiteninhalt wird vom Browser verworfen.Eine alternative und vielleicht sauberere Möglichkeit, dies zu tun, besteht darin, ein neues
iframe
Element zu erstellen und dieKeepAlive.aspx
Seite darin zu laden . Dasiframe
Element wird ausgeblendet, z. B. indem esdiv
irgendwo auf der Seite zu einem untergeordneten Element eines ausgeblendeten Elements gemacht wird.Aktivitäten auf der Seite selbst können durch Abfangen von Maus- und Tastaturaktionen für den gesamten Seitenkörper erkannt werden:
Ich kann diese Idee nicht würdigen. Siehe: https://www.codeproject.com/Articles/227382/Alert-Session-Time-out-in-ASP-Net .
quelle