Jaki jest najłatwiejszy i najbardziej dyskretny sposób na utrzymanie sesji ASP.NET, o ile użytkownik ma otwarte okno przeglądarki? Czy są to połączenia czasowe AJAX? Chcę zapobiec następującym sytuacjom: czasami użytkownicy otwierają okno przez długi czas, potem wprowadzają coś, a po przesłaniu nic już nie działa, ponieważ sesja po stronie serwera wygasła. Nie chcę zwiększać wartości limitu czasu na serwerze o więcej niż 10 minut, ponieważ chcę, aby sesje zamknięte (przez zamknięcie okna przeglądarki) szybko się kończyły.
Sugestie, próbki kodu?
Odpowiedzi:
Używam JQuery do wykonania prostego wywołania AJAX do fikcyjnego modułu obsługi HTTP, który nie robi nic poza utrzymaniem mojej sesji przy życiu:
Procedura obsługi sesji może być tak prosta, jak:
Kluczem jest dodanie IRequiresSessionState, w przeciwnym razie sesja nie będzie dostępna (= null). Program obsługi może oczywiście również zwrócić zserializowany obiekt JSON, jeśli niektóre dane powinny zostać zwrócone do wywołującego JavaScript.
Udostępnione przez web.config:
dodane z balexandre 14 sierpnia 2012 r
Ten przykład podobał mi się tak bardzo, że chcę ulepszyć HTML / CSS i część beatu
Zmień to
w
i dodaj
HTML i CSS
tutaj jest przykład na żywo tylko dla części bijącej : http://jsbin.com/ibagob/1/
źródło
DateTime.Now
było po prostu pokazanie, kiedy sesja została ostatnio zaktualizowana za pomocą pulsu.Jeśli używasz ASP.NET MVC - nie potrzebujesz dodatkowego modułu obsługi HTTP ani pewnych modyfikacji pliku web.config. Wszystko, czego potrzebujesz - wystarczy dodać prostą akcję w kontrolerze Home / Common:
, napisz kawałek kodu JavaScript, taki jak ten (umieściłem go w jednym z plików JavaScript witryny):
i zainicjuj tę funkcję, wywołując funkcję JavaScript:
Proszę zanotować! Zaimplementowałem tę funkcjonalność tylko dla autoryzowanych użytkowników (w większości przypadków nie ma powodu, aby utrzymywać stan sesji dla gości), a decyzja o utrzymaniu stanu sesji jest oparta nie tylko na - czy przeglądarka jest otwarta czy nie, ale autoryzowany użytkownik musi wykonać jakąś czynność na stronie (przesuń myszkę lub wpisz jakiś klawisz).
źródło
@Url.Action("KeepSessionAlive","Home")
funkcji inicjalizatora, aby nie musieć zakodować adresu URL na stałe, a także wrzucić pierwszego bloku do IIFE i po prostu wyeksportować,SetupSessionUpdater
ponieważ jest to jedyna rzecz, która musi być wywoływana zewnętrznie - coś w rodzaju to: SessionUpdater.jssetInterval(KeepSessionAlive, 300000)
Za każdym razem, gdy wysyłasz żądanie do serwera, resetuje się limit czasu sesji. Możesz więc po prostu wykonać wywołanie ajax do pustego modułu obsługi HTTP na serwerze, ale upewnij się, że pamięć podręczna modułu obsługi jest wyłączona, w przeciwnym razie przeglądarka buforuje twój program obsługi i nie wykona nowego żądania.
KeepSessionAlive.ashx.cs
.JS:
@veggerby - Nie ma potrzeby narzutu przechowywania zmiennych w sesji. Wystarczy wykonać zapytanie do serwera.
źródło
Czy naprawdę musisz zachować sesję (czy masz w niej dane?), Czy wystarczy to sfałszować, przywracając sesję, gdy nadejdzie żądanie? Jeśli pierwszy, użyj powyższej metody. Jeśli drugi, spróbuj czegoś w rodzaju obsługi zdarzeń Session_End.
Jeśli masz uwierzytelnianie za pomocą formularzy, otrzymasz coś podobnego do Global.asax.cs
Ustawiasz czas życia biletu na znacznie dłuższy niż czas trwania sesji. Jeśli nie uwierzytelniasz się lub używasz innej metody uwierzytelniania, istnieją podobne sztuczki. Wygląda na to, że interfejs sieciowy Microsoft TFS i SharePoint wydają się ich używać - okazuje się, że jeśli klikniesz łącze na nieaktualnej stronie, w wyskakującym okienku pojawi się monit o uwierzytelnienie, ale jeśli użyjesz tylko polecenia, działa.
źródło
możesz po prostu napisać ten kod w swoim pliku skryptu java, to wszystko.
Jest
(20-1)*60*1000
to czas odświeżania, odświeży limit czasu sesji. Limit czasu odświeżania jest obliczany jako domyślny czas z iis = 20 minut, czyli 20 × 60000 = 1200000 milisekund - 60000 milisekund (jedna minuta przed wygaśnięciem sesji) to 1140000.źródło
Oto alternatywne rozwiązanie, które powinno przetrwać, jeśli komputer kliencki przejdzie w tryb uśpienia.
Jeśli masz ogromną liczbę zalogowanych użytkowników, używaj tego ostrożnie, ponieważ może to pochłonąć dużo pamięci serwera.
Po zalogowaniu (robię to w zdarzeniu LoggedIn kontrolki logowania)
źródło
Spędziłem kilka dni, próbując wymyślić, jak przedłużyć sesję użytkownika w formularzach WebForm za pomocą wyskakującego okna dialogowego, które daje użytkownikowi opcję odnowienia sesji lub umożliwienia jej wygaśnięcia. Najważniejszą rzeczą, którą musisz wiedzieć, jest to, że nie potrzebujesz żadnego z tych fantazyjnych rzeczy „HttpContext”, które mają miejsce w niektórych innych odpowiedziach. Wszystko czego potrzebujesz to $ .post () jQuery; metoda. Na przykład podczas debugowania użyłem:
a na swojej działającej witrynie użyłbyś czegoś takiego jak:
To takie proste. Ponadto, jeśli chcesz poprosić użytkownika o możliwość odnowienia sesji, wykonaj coś podobnego do następującego:
Nie zapomnij dodać okna dialogowego do swojego HTML:
źródło
Jeśli chodzi o rozwiązanie veggerby, jeśli próbujesz zaimplementować je w aplikacji VB, uważaj, próbując uruchomić dostarczony kod przez tłumacza. Będzie działać:
Ponadto zamiast wywoływać funkcję heartbeat (), taką jak:
Zamiast tego nazwij to tak:
Po pierwsze, setTimeout uruchamia się tylko raz, podczas gdy setInterval uruchamia się wielokrotnie. Po drugie, wywołanie heartbeat () jak napisu nie zadziałało dla mnie, podczas gdy wywołanie tego jak rzeczywistej funkcji tak.
I mogę absolutnie w 100% potwierdzić, że to rozwiązanie przezwycięży absurdalną decyzję GoDaddy o wymuszeniu 5-minutowej sesji Apppool w Plesku!
źródło
Tutaj wersja wtyczki JQuery rozwiązania Maryan z optymalizacją uchwytów. Tylko z JQuery 1.7+!
i jak to importuje w twoim * .cshtml
źródło
[Spóźniony na przyjęcie ...]
Innym sposobem, aby to zrobić bez narzutu wywołania Ajax lub modułu obsługi WebService, jest załadowanie specjalnej strony ASPX po określonym czasie (tj. Przed przekroczeniem limitu czasu stanu sesji, który zwykle wynosi 20 minut):
KeepAlive.aspx
Strona jest po prostu pusta strona, która nie robi nic, ale dotyk / odświeżyćSession
stan:Działa to poprzez utworzenie elementu
img
(obrazu) i zmuszenie przeglądarki do załadowania jego zawartości zeKeepAlive.aspx
strony. Załadowanie tej strony powoduje, że serwer dotyka (aktualizuje)Session
obiektu, wydłużając przedział czasu wygaśnięcia sesji (zwykle o kolejne 20 minut). Rzeczywista zawartość strony internetowej jest odrzucana przez przeglądarkę.Alternatywnym i być może czystszym sposobem na to jest utworzenie nowego
iframe
elementu i załadowanieKeepAlive.aspx
do niego strony.iframe
Element jest ukryte, takie jak wprowadzenie elementu dziecka ukrytegodiv
elementu gdzieś na stronie.Aktywność na samej stronie można wykryć, przechwytując działania myszy i klawiatury dla całej treści strony:
Nie mogę przypisać sobie tego pomysłu; patrz: https://www.codeproject.com/Articles/227382/Alert-Session-Time-out-in-ASP-Net .
źródło