Avatar billede Driton Seniormester
09. oktober 2013 - 17:50 Der er 12 kommentarer og
1 løsning

Intet sker ved afslutning af session tid

Jeg har brugt en eksempel fra microsoft
http://code.msdn.microsoft.com/AspNetAlertSessionExpire-c230a148
Angående session eksemplet virker helt fint osv.
Men problemet er bare at i global.asax under session_end har jeg tilføjet en linje der redirecter mig en en anden side, når session udløber. Men det virker ikke?
void Session_End(object sender, EventArgs e)
        {
            Response.Redirect("SessionExpired.htm");
        }
jeg har tilføjet denne linje her i webconfig filen
<system.web>
<sessionState mode="InProc" timeout="1"></sessionState>
<compilation debug="true" targetFramework="4.0" />
</system.web>

der stod at InProc skulle være tilstede hvis der skulle ske noget. Men det virker ikke. Er der en eller anden, som kan hjælpe mig med dette problem?
Avatar billede Driton Seniormester
09. oktober 2013 - 17:52 #1
Hele min kode ligger i linken der. så i skulle få adgang til det hele bare ved at kigge på eksemplet :)
Avatar billede arne_v Ekspert
09. oktober 2013 - 18:06 #2
Altsaa jeg gaar ind paa din side og laver noget. Saa lukker jeg browseren ned, slukker PC'en og ser film paa TV. Og saa efter X minutter timer min session ud.

:-)
Avatar billede Driton Seniormester
09. oktober 2013 - 18:22 #3
hehe det er ikke min side det er microsoft eksempel på hvordan man kan håndtere sagen :), men siger du at selvom min session løber ud, så skal jeg give den noget tid før den reagere? fordi selvom jeg får en session udløbet, får jeg stadige ikke min vilje angående kodet :)
Avatar billede Driton Seniormester
09. oktober 2013 - 18:24 #4
At den skal lave en sideskift
Avatar billede arne_v Ekspert
09. oktober 2013 - 18:29 #5
Jeg siger at naar session timer ud saa er der med 99% sandsynlighed ikke nogen browser at senbde redirect til.
Avatar billede Driton Seniormester
09. oktober 2013 - 18:36 #6
Med al-respekt jeg siger ikke det her for at nedgøre dig, men jeg forstår ikke hvad du prøver at fortælle mig, jeg tror det er mig der er lidt af en retard her :)
kan jeg godt med om en om-formulering omkring hvad du prøver på at sige til mig. fordi jeg ønsker inderligt at forstå dig, fordi jeg ved du har din viden på plads omkring C#/asp.net
Avatar billede Driton Seniormester
09. oktober 2013 - 18:37 #7
kan jeg godt få en*
Avatar billede arne_v Ekspert
09. oktober 2013 - 19:35 #8
Jeg proever lige at forklare lidt.

Grundliggende er HTTP stateless d.v.s. at briwser sender request, server sende response og saa er det done og en request-response er helt uafhaengig af en anden request-respons.

Det duer ikke hvis man skal logge ind eller skal gemme noget i session mellem forskellige request-respons.

Saa man etablerer en session oven paa HTTP. Naar session starter saa sende serveren en session cookie i respons. Alle efter foelgende request som er en del af den session sende browseren saa session cookie med i request.

Serveren har en lille in memory i database (Dictionary med session id fra session cookie som key) hvor den gemmer oplysninger om hver session herunder Session variable.

Naar en request med session cookie ankommer saa finder serveren det relevante data frem derfra.

Men hvordan undgaar man at den in memory database bare vokser og vokser?

Jo - serveren noterer for hver session hvornaar der sidst har vaeret en request. Og en baggrundstraad checker en gang imellem og session som har vaeret inaktive i N minutter bliver fjernet.

N er typisk 30.

Saa efter de N minutters inaktivitet bliver session fjernet og baggrundtraaden kalder Session_End.

Det kunne jo vaere at det var en kurv med varer i session som skulle gemmes i database til naeste gang brugeren loggede ind. Eller noget andet.

Men der er ikke nogen request fra browseren (hvos der var saa ville session jo ikke have timet ud) og derfor kan du heller ikke lave en respons redirect.

Hvis N er 30 minutter er brugeren med stor sandsynlighed lukket ned eller gaaet videre til en anden side.

Ihvertfald har du ingen mulighed for sende noget til brugeren laengere.
Avatar billede anri Novice
09. oktober 2013 - 19:54 #9
JEg har gransket det eksempel du har linket til, og jeg bagriber ikke at det kan lade sig gøre.

Ganske som Arne siger, udløber en session jo fordi der ikke er nogen trafik, og hvis man spørger serveren om sessionen er ved at løbe ud, så genererer man netom noget trafik og derved resetter man sessionens udløb.

For mig, ser det ud til at den kan fortælle at sessionen ER udløbet, men så er det jo alligevel for sent at gøre noget ved det.

Jeg vil mene at det skal løses på klient-siden på følgende måde:
Include dette javascript på alle sider
setTimeout(function(){alert("Nu timer jeg ud!!")},[timeout-tid - x minutter])

Og ikke engang her vil man kunne være sikker, for der kan jo være et ajax-kald, der refresher sessionen, men ikke resetter javascript-timeoutet.
Avatar billede anri Novice
09. oktober 2013 - 19:57 #10
Derudover, kan serveren ikke pushe SessionExpired.htm ud til browseren, med mindre browseren selv kontakter serveren.  og det sker ikke ved session udløb..  ..browseren aner ikke hvornår det sker (om det er sat til 1 sekund eller 4 timer)
Avatar billede anri Novice
09. oktober 2013 - 20:02 #11
Nu har jeg gransket lidt mere i koden, og det der sker er at den web-control foretager et callback og ser om sessionen er udløbet.

Hvis dette sker oftere end sessionens timeout, så vil sessionen aldrig udløbe, men sker det sjældnere, ja så vil controllen kunne fortælle om det.

I ekseplet benyttes global.asax ikke og Session_End er en ren server-side event, der ikke kommunikerer med browseren.
Avatar billede Driton Seniormester
11. oktober 2013 - 18:47 #12
Hm, jeg forstår. Tak for svaret for jer begge. jeg ved ikke helt hvem jeg skal tildele pointen.
Avatar billede Driton Seniormester
20. august 2015 - 06:07 #13
Luk
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester