[ASP.NET] sessionState timeout probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Griffin
  • Registratie: Maart 2003
  • Laatst online: 14:15

Griffin

Is mythical

Topicstarter
Ja ik vermoed dat ik een timeout probleem heb, ik weet het echter niet zeker aangezien ik geen flauw idee heb waar ik iets kan vinden van de fout (in de code) en het gebeurt op meerdere plaatsen in de applicatie.

De applicatie op zich werkt goed, echter als je ongeveer 30minuten (soms wat langer) de applicatie heb open staan maar niet gebruikt en het daarna gaat gebruiken krijg je een fout melding.

Als ik bijvoorbeeld een 'validator' laat afgaan krijg in een Javascript error die meld:
code:
1
2
3
Sys.WebForms.PageRequestManagerServerErrorException: Object reference not set to an instance of an object.

URI: [ApplicatieLocatie]/ScriptResource.axd?d=Dc9-UlnhYJh8MdtPgKqwid4lqtkwsDKQHlQhntMzv2uFdUSbkK_fKPmdNlduAF4sHd0cgUOVOl1mlUvSGtqbSiHk6PRjBs6jBwhq3sXDNKxghJh5Cd8LLEJYjZK3Xetjx2o3dVGw-_PTQ5_uStRZr0y827TS3k9NGBenuLxjHJsHlArD0&t=1d5be520

En die lange rits aan tekens is niet altijd het zelfde. Ik krijg dan geen Event in mijn server log.

Echter bij andere handelingen is het niet een JS error maar de volgende:
code:
1
2
3
4
5
6
7
8
9
10
Server Error
Object reference not set to an instance of an object.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +14
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +35
   System.Web.UI.Control.OnLoad(EventArgs e) +99
   System.Web.UI.Control.LoadRecursive() +50
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +627

Nu staat hierboven niet de volledige stacktrace, de trace start in mijn eigen applicatie maar komt daarna uit in "System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)".
Op dit moment heb ik wel een Event in de serverlog, namelijk de zelfde foutmelding zoals ik op het scherm krijg (zoals die hierboven in de 'code' blok staat).

Om deze (includeStagesBeforeAsyncPoint) reden denk ik dat het niet mijn eigen code is maar iets met een timeout.
Als ik echter google op de laatste regel dan krijg ik veel resultaten alleen niet waar ik iets mee kan, in mijn ogen, met mijn applicatie.

Dus nu is mijn vraag waar zou het aan kunnen liggen, en hoe is het wellicht op te lossen.

Acties:
  • 0 Henk 'm!

Anoniem: 39520

Het ziet ernaar uit dat je sessie verlopen is, controleer even in de web.config waar je je session timeout op hebt staan.

<system.web>
<sessionState timeout=""/>

Als deze niet aanwezig dan is de default 20 minuten.

Acties:
  • 0 Henk 'm!

  • Guldan
  • Registratie: Juli 2002
  • Laatst online: 17:57

Guldan

Thee-Nerd

Anders zou je ook even de code op een testomgeving live kunnen zetten en het dan proberen te reproduceren als je het runt vanuit Visual Studio.

You know, I used to think it was awful that life was so unfair. Then I thought, wouldn't it be much worse if life were fair, and all the terrible things that happen to us come because we actually deserve them?


Acties:
  • 0 Henk 'm!

  • Griffin
  • Registratie: Maart 2003
  • Laatst online: 14:15

Griffin

Is mythical

Topicstarter
@Guldan:
Ik heb net lokale test gedraaid en het gaat fout op de aanvraag van een 'Session'. Dus het is een session probleem en dat deze verlopen is. Ik heb toen nog even verder getest door de session timeout op 5 minuten te zetten. Het is vanzelfsprekend dat de sessie al verliep (en dus error gaf) na 5 minuten.

Ik heb echter geprobeerd wat @D32 melde "<sessionState timeout=""/>" echter de empty value "" is niet toegestaan. Toen ben ik gaan zoeken en het blijkt dat 'unlimited timeout' dus niet bestaat. De maximale value is 1 jaar, dus na overleg met de collega's zijn we eruit gekomen dat er een 1 dag session verloop ingesteld word.

Acties:
  • 0 Henk 'm!

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Weet je zeker dat je dat wilt? Dan blijven sessies van mensen die al lang niet meer in de applicatie werken ook nog actief.

Oops! Google Chrome could not find www.rijks%20museum.nl


Acties:
  • 0 Henk 'm!

Anoniem: 39520

Griffin schreef op woensdag 16 februari 2011 @ 09:15:
Ik heb echter geprobeerd wat @D32 melde "<sessionState timeout=""/>" echter de empty value "" is niet toegestaan. Toen ben ik gaan zoeken en het blijkt dat 'unlimited timeout' dus niet bestaat. De maximale value is 1 jaar, dus na overleg met de collega's zijn we eruit gekomen dat er een 1 dag session verloop ingesteld word.
Het was ook alleen om aan te geven waar je de instelling moest maken ;)

Ik zou aanraden om bij het verlopen van de sessie de inlog pagina weer te tonen als deze er is, is die er niet zorg dan dat de gegevens die niet meer in de sessie staan opnieuw opgehaald worden zodat de applicatie door kan draaien.

Acties:
  • 0 Henk 'm!

  • Griffin
  • Registratie: Maart 2003
  • Laatst online: 14:15

Griffin

Is mythical

Topicstarter
P_de_B schreef op woensdag 16 februari 2011 @ 09:17:
Weet je zeker dat je dat wilt? Dan blijven sessies van mensen die al lang niet meer in de applicatie werken ook nog actief.
Maar als ze de browser afsluiten is de sessie toch weg, of word de sessie op de server opgeslagen en dus resulteren in veel open sessies in tragere applicatie?
Anoniem: 39520 schreef op woensdag 16 februari 2011 @ 11:06:
[...]

Het was ook alleen om aan te geven waar je de instelling moest maken ;)

Ik zou aanraden om bij het verlopen van de sessie de inlog pagina weer te tonen als deze er is, is die er niet zorg dan dat de gegevens die niet meer in de sessie staan opnieuw opgehaald worden zodat de applicatie door kan draaien.
Er word ingelogd via de Active Directory dus heb geen inlog pagina. Maar hoe stel je de sessie opnieuw in als deze aflopen? Moet dit in de Global.asax in 'Session_end'?

Acties:
  • 0 Henk 'm!

  • Cloud
  • Registratie: November 2001
  • Laatst online: 13:45

Cloud

FP ProMod

Ex-moderatie mobster

Griffin schreef op woensdag 16 februari 2011 @ 15:59:
[...]

Maar als ze de browser afsluiten is de sessie toch weg, of word de sessie op de server opgeslagen en dus resulteren in veel open sessies in tragere applicatie?
Objecten/informatie die jij in het Session object bewaart, worden inderdaad op de server opgeslagen. Niet bij de gebruiker. Dat kan alleen d.m.v. Cookies.

Dat jij het browser-scherm sluit kan de server natuurlijk niet detecteren. In elk geval niet zonder wat toegevoegde Javascript.

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


Acties:
  • 0 Henk 'm!

  • Griffin
  • Registratie: Maart 2003
  • Laatst online: 14:15

Griffin

Is mythical

Topicstarter
Griffin schreef op woensdag 16 februari 2011 @ 15:59:

[...]

Er word ingelogd via de Active Directory dus heb geen inlog pagina. Maar hoe stel je de sessie opnieuw in als deze aflopen? Moet dit in de Global.asax in 'Session_end'?
Ik ben even gaan kijken en in mijn Session_start gebruik ik de volgende code om te kijken wie probeerd toegang te krijgen:
code:
1
Request.ServerVariables["LOGON_USER"]

Hiermee check ik ook nog wat dingen in de database maar dat is nu niet relevant.
Echter als de sessie verloopt (ik had als test deze even op 1 minuut gezet) krijg ik in VS2008 de volgende fout:
code:
1
Request is not available in this context

Nu mijn vraag hoe kan ik de sessie 'refreshen' als deze af loopt?

  • Griffin
  • Registratie: Maart 2003
  • Laatst online: 14:15

Griffin

Is mythical

Topicstarter
Na lang zoeken heb ik, zover ik nu kan zien en testen, een oplossing gevonden. Om gelijk even naslag te geven voor andere zet ik hier mijn oplossing neer:

1. Zet je sessionState timeout op een gewenste tijdspan. (in mijn geval is dit 5minuten)
2. Include de jquery library
3. Plaats ergens in je solution een lege aspx file (mijn geval RefreshSessionState.aspx)
4. en plaats in je 'html head' de volgende code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
    <script language="javascript" type="text/javascript">
        function KeepSessionAlive() 
        {
            // 1. Maak request naar server
            $.post("http://[lokatie van server]/RefreshSessionState.aspx");
            
            // 2. Maak nieuwe schedule voor volgende aanroep 60000 miliseconden (1 minuut)
            setInterval(KeepSessionAlive, 60000);
        }

        // Eerste keer aanroep van methode
        KeepSessionAlive();  
     </script>


Er word nu elke minuut een request naar de server gestuurd waardoor deze denkt dat de gebruiker nog actief is. Als de gebruiker de applicatie niet meer open heeft staan dan wordt de JS code niet uitgevoerd en word de sessie gestopt door .NET wanneer de timeout bereikt is.

Meer info

[ Voor 3% gewijzigd door Griffin op 17-02-2011 14:54 ]


  • Guldan
  • Registratie: Juli 2002
  • Laatst online: 17:57

Guldan

Thee-Nerd

Ik weet niet precies wat je in RefreshSessionSate.aspx aan code hebt staan, maar kan je dan niet beter in de session end de logica van die refreshsessionstate.aspx pagina setten?

You know, I used to think it was awful that life was so unfair. Then I thought, wouldn't it be much worse if life were fair, and all the terrible things that happen to us come because we actually deserve them?


  • Griffin
  • Registratie: Maart 2003
  • Laatst online: 14:15

Griffin

Is mythical

Topicstarter
Guldan schreef op donderdag 17 februari 2011 @ 15:00:
Ik weet niet precies wat je in RefreshSessionSate.aspx aan code hebt staan, maar kan je dan niet beter in de session end de logica van die refreshsessionstate.aspx pagina setten?
Daar staat helemaal niets in, het is een lege aspx pagina welke gebruikt wordt om de sessie actief te houden.

Verdikkeme,
Ergens gaat wel iets fout, de code word per 'loop' steeds vaker aangeroepen en dus na veel minuten zijn er zoveel requests dat de browser soms crasht.

[ Voor 17% gewijzigd door Griffin op 17-02-2011 15:15 ]


  • Guldan
  • Registratie: Juli 2002
  • Laatst online: 17:57

Guldan

Thee-Nerd

Is het iets om in de session_end een redirect naar een pagina te zetten waarin staat: "Omdat u geen activiteit heeft vertoond in het laatste uur komt u op deze pagina terecht. Indien u verder wilt gaan klik hier" en dan in de session start ook een check dat het request object != null is.

You know, I used to think it was awful that life was so unfair. Then I thought, wouldn't it be much worse if life were fair, and all the terrible things that happen to us come because we actually deserve them?


  • Griffin
  • Registratie: Maart 2003
  • Laatst online: 14:15

Griffin

Is mythical

Topicstarter
Guldan schreef op donderdag 17 februari 2011 @ 15:27:
Is het iets om in de session_end een redirect naar een pagina te zetten waarin staat: "Omdat u geen activiteit heeft vertoond in het laatste uur komt u op deze pagina terecht. Indien u verder wilt gaan klik hier" en dan in de session start ook een check dat het request object != null is.
Het feit is dat de eis is dat de sessie niet verloopt zolang de app open staat.

Maar toen ging ik verder kijken op de site waar ik de oplossing gevonden had en daar stond er ook een met ASP AJAX (met een timer) en die werkt tot nu toe gewoon goed.

Anoniem: 187672

Griffin schreef op donderdag 17 februari 2011 @ 15:07:
[...]
Verdikkeme,
Ergens gaat wel iets fout, de code word per 'loop' steeds vaker aangeroepen en dus na veel minuten zijn er zoveel requests dat de browser soms crasht.
Dat komt volgens mij omdat je eerst KeepSessionAlive aanroept en daarin een setInterval die ook KeepSessionAlive aanroept.
De setInterval zorgt automatisch al voor dat die elke opgegeven interval opnieuw aangeroepen wordt.
Als je er setTimeout van maak, is het probleem weg.
of ipv de eerste KeepSessionAlive aanroep, deze vervangen door setInterval(KeepSessionAlive, 60000);
en deze uit de methode zelf weghalen.

  • Griffin
  • Registratie: Maart 2003
  • Laatst online: 14:15

Griffin

Is mythical

Topicstarter
Anoniem: 187672 schreef op donderdag 17 februari 2011 @ 15:56:
[...]


Dat komt volgens mij omdat je eerst KeepSessionAlive aanroept en daarin een setInterval die ook KeepSessionAlive aanroept.
De setInterval zorgt automatisch al voor dat die elke opgegeven interval opnieuw aangeroepen wordt.
Als je er setTimeout van maak, is het probleem weg.
of ipv de eerste KeepSessionAlive aanroep, deze vervangen door setInterval(KeepSessionAlive, 60000);
en deze uit de methode zelf weghalen.
Klinkt logisch, Nu ik de andere al heb gemaakt (en deze werkt) hou ik het bij die. Maar toch bedankt voor de uitleg waar het fout ging :D.
Pagina: 1