[ASP.NET] Problemen met session-state

Pagina: 1
Acties:

  • Jabbah
  • Registratie: Februari 2004
  • Laatst online: 21-05 11:01
Ik heb een alternatief bedacht voor het opslaan van variabelen in de Session.
Het is een class die ik ApplicationState noem. Variabelen die je normaal in de Session zou bewaren, kan je nu in deze class bewaren.

Stel je hebt een aspx pagina met een DataGrid met records uit een database. Wanneer je een record aanklikt wordt een nieuwe pagina geladen met alle gedetailleerde informatie over dat record. In dit geval zou je de ID van dat record willen meegeven naar de nieuwe pagina.

De class ApplicationState ziet er zo uit (let op de static declaratie van de Hashtable en de class methods:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System;
using System.Collections;

namespace state
{
    public class ApplicationState
    {
        private static Hashtable state = new Hashtable();

        public static void AddProperty(Object o, string key)
        {
            state.Add(key, o);
        }

        public static Object GetProperty(string key)
        {
            return state["test"];
        }
    }
}

In pagina ik kan ik het ID opslaan door:
code:
1
ApplicationState.AddProperty(id, "customerId");

En in pagina 2 kan ik deze ID weer ophalen door:
code:
1
ApplicationState.GetProperty("customerId");

De reden dat ik deze oplossing bedacht heb is omdat ik nogal wat problemen heb met het verdwijnen van Session variables (antivirus scanner mogelijke oorzaak). Deze methode werkt altijd. En het gebruik van de querystring hou ik niet van.
Het gebruik van Server.Transfer zou nog een mogelijkheid zijn, maar die vind ik vrij omslachtig, en bij het laden van de tweede aspx pagina zie je (als ik het me goed herinner) nog steeds de naam van de eerste aspx pagina in de URL-balk van IE.

Dit lijkt me een prima oplossing, of zie ik nog belangrijke nadelen over het hoofd?

PS. Ik ben me ervan bewust dat er in de class nog een null-check moet komen of een try/catch, en eventueel een RemoveProperty method.

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:33
Ik vind het wel een verwarrende naam. Er bestaat nl. zoiets als 'Application state', daar worden variabelen in bewaard die een scope over de applicatie hebben, en die dus voor iedere sessie geldig zijn.

Daarnaast vraag ik me ook af wat er met die class gebeurt tussen postbacks? Je zult de instance van die class die je gebruikt toch ook ergens moeten bewaren? :?
Of mis ik nu iets?

https://fgheysels.github.io/


  • Jabbah
  • Registratie: Februari 2004
  • Laatst online: 21-05 11:01
Er is geen instance van de class; het is nl. een static class.

  • Jabbah
  • Registratie: Februari 2004
  • Laatst online: 21-05 11:01
En de variabelen in de Application State die jij noemt zijn toch zichtbaar voor alle gebruikers, correct me if I'm wrong.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 12:49

gorgi_19

Kruimeltjes zijn weer op :9

Volgens mij werkt het altijd, omdat het niet session gebonden is, maar jouw methodiek ook een global scope heeft. Oftewel: Je gebruikt een soortement van applicatie variabelen.

Een Antivirus kan alleen een session verklooien als die loopt te vervelen met cookies e.d.; de enige referentie / koppeling tussen sessie / gebruiker. Het lijkt me sterk dat dit een alternatief is om deze koppeling te handhaven.

[ Voor 12% gewijzigd door gorgi_19 op 19-04-2004 14:54 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:33
gorgi_19 schreef op 19 april 2004 @ 14:47:

Een Antivirus kan alleen een session verklooien als die loopt te vervelen met cookies e.d.; de enige referentie / koppeling tussen sessie / gebruiker. Het lijkt me sterk dat dit een alternatief is om deze koppeling te handhaven.
Bedoel je nu een anti-virus die op de client draait? Zoja, is het dan niet op te lossen mbhv cookie-less sessions?

* whoami heeft eigenlijk nog geen last gehad van sessie's die verkloot worden.

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 12:49

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 19 april 2004 @ 14:54:
[...]


Bedoel je nu een anti-virus die op de client draait? Zoja, is het dan niet op te lossen mbhv cookie-less sessions?

* whoami heeft eigenlijk nog geen last gehad van sessie's die verkloot worden.
Jups, daar doelde ik op. Vergelijk het met het bekende verschijnsel van het blocken van cookies, dan vernaggel je ook je sessies, omdat het SessieID niet meer achterhaald kan worden van de browser.

Trouwens, net eventjes wat voorbeeldcode gemaakt..
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Public Class WebForm1
    Inherits System.Web.UI.Page
    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        TestClass.Create()

    End Sub

End Class

Public Class TestClass

    Private Shared _tc As TestClass

    Private Sub New()
    End Sub

    Public Shared Function Create() As TestClass

        If _tc Is Nothing Then

            _tc = New TestClass

            HttpContext.Current.Response.Write("new class")

        Else
            HttpContext.Current.Response.Write("old class")
            Return _tc


        End If

    End Function

End Class

Open maar een browser in IE; eerste keer zie je dan new class; een refresh levert daarna "old class op".

Vervolgens een browservenster in Mozilla geopend. Deze krijgt een nieuw sessieID, en zou dus ook een nieuwe sessie moeten krijgen. Ga je dan naar de pagina toe, dan zie je gelijk "old class". Oftewel: de variabelen worden over de sessies gedeeld.

'k heb trouwens ook geen idee of en wanneer dit door de GC opgeruimd gaat worden.
Het gebruik van Server.Transfer zou nog een mogelijkheid zijn, maar die vind ik vrij omslachtig, en bij het laden van de tweede aspx pagina zie je (als ik het me goed herinner) nog steeds de naam van de eerste aspx pagina in de URL-balk van IE.
Server.Transfer == eng. Het vernaggelt best makkelijk je Viewstate en heeft grote problemen met Blowery's HTTPCompression; 2 redenen om het iig niet te gebruiken. Wil je een andere URL, dan kan je altijd nog RewritePath gebruiken (even vergeten in welke class die zit.. :P )

[ Voor 74% gewijzigd door gorgi_19 op 19-04-2004 15:03 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Jabbah
  • Registratie: Februari 2004
  • Laatst online: 21-05 11:01
Waarom mijn sessies precies verloren gaan, weet ik niet. Ik heb de oorzaak nooit precies kunnen achterhalen. Het kan dus door een virusscanner komen. Voor zover ik weet, wordt de server gerestart wanneer de global.asax of de web.config worden gescant.
Ja, ik kan cookieless op true zetten. Dan krijg ik weer van die lelijke URL's. Ik vind het gebruik van mijn klasse zo gek nog niet, en ik heb nog geen nadelen kunnen ontdekken.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 12:49

gorgi_19

Kruimeltjes zijn weer op :9

Jabbah schreef op 19 april 2004 @ 15:03:
Waarom mijn sessies precies verloren gaan, weet ik niet. Ik heb de oorzaak nooit precies kunnen achterhalen. Het kan dus door een virusscanner komen. Voor zover ik weet, wordt de server gerestart wanneer de global.asax of de web.config worden gescant.
Cookies op disabled?
Ja, ik kan cookieless op true zetten. Dan krijg ik weer van die lelijke URL's. Ik vind het gebruik van mijn klasse zo gek nog niet, en ik heb nog geen nadelen kunnen ontdekken.
:? Dat probeer ik net aan te tonen.. Jouw class heeft een global scope; user A krijgt de waarden van User B.
Verder: lelijke URLS? :? RewritePath moet ook eea oplossen?

[ Voor 6% gewijzigd door gorgi_19 op 19-04-2004 15:13 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Jabbah
  • Registratie: Februari 2004
  • Laatst online: 21-05 11:01
gorgi_19 schreef op 19 april 2004 @ 15:04[/message]:
:? Dat probeer ik net aan te tonen.. Jouw class heeft een global scope; user A krijgt de waarden van User B.
Verder: lelijke URLS? :? RewritePath moet ook eea oplossen?
Ja, je hebt gelijk. Ik las het verkeerd.. 8)7

  • Jabbah
  • Registratie: Februari 2004
  • Laatst online: 21-05 11:01
gorgi_19 schreef op 19 april 2004 @ 15:04

Cookies op disabled?
Nee, dat heb ik al geprobeerd. Laat ik het probleem wat duidelijker omschrijven:
Ik heb bijv. 2 pagina's. Op pagina 1 vul ik een variabele en stop 'm in de Session, dan doe ik een redirect naar pagina 2 en lees de variabele uit de Session en ik heb keurig m'n waarde terug.
De URL naar pagina 1 is http://localhost/test/WebForm1.aspx

Het vreemde is dat als ik localhost vervang door de naam van mijn PC, dus:
http://wks_dev_03/test/WebForm1.aspx
.. ik een NullReferenceException krijg bij het opvragen van de variabele uit m'n Session. M.a.w. Session weg! Hetzelfde liedje dus als ik vanaf een andere PC de URL benader.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 12:49

gorgi_19

Kruimeltjes zijn weer op :9

erhm... ja? lijkt me logisch? Een ander domein == andere sessie, normaliter?
Of verwacht je dat een sessie op
http://localhost
ook geldig is op
http://mijncomputer
?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:33
Euhm, dat is toch geen probleem? Dat is juist een sessie.

Als ik naar een webpagina surf, dan wordt er een nieuwe sessie gestart.
Start ik een ander browser-venster op, en ik surf ook naar die webpage (al dan niet vanop dezelfde pc), dan wordt er opnieuw een sessie-gecreeërd voor die sessie.

https://fgheysels.github.io/


  • Jabbah
  • Registratie: Februari 2004
  • Laatst online: 21-05 11:01
Oh, nee dat bedoel ik niet. Stel ik ga naar http://wks_dev_03/test/WebForm1.aspx (verder geen andere browsers open) en ik bewaar een variabele in de sessie. Vanuit deze pagina ga ik naar een andere pagina (dmv een redirect) waar ik deze variabale weer ophaal en dan krijg ik de exception die ik beschreef.

Als ik nu in plaats van mijn pc naam, localhost had ingevuld, dan zou het wel goed gaan.

Met andere woorden. Mijn sessie lijkt te verdwijnen bij een redirect tussen 2 pagina's wanneer ik mijn computernaam in de URL gebruik. Maar de sessie blijft behouden wanneer ik localhost gebruik.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 12:49

gorgi_19

Kruimeltjes zijn weer op :9

Als je IE gebruikt, zie je soms rechts onderaan een tekentje staan dat cookies worden geblocked. Is dat bij jou ook het geval?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Jabbah
  • Registratie: Februari 2004
  • Laatst online: 21-05 11:01
Je bedoelt zeker dat oogje met dat rode stopbordje?

Nee, dat icoontje is niet aanwezig..

  • Jabbah
  • Registratie: Februari 2004
  • Laatst online: 21-05 11:01
*schop*

Zie het probleem dat ik beschrijf 3 posts hierboven. Iemand een idee?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Naar welke pagina redirect je?

Professionele website nodig?


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Jabbah schreef op 14 juni 2004 @ 10:06:
*schop*

Zie het probleem dat ik beschrijf 3 posts hierboven. Iemand een idee?
Je redirect niet toevallig naar /localhost/nieuwePagina.aspx? Cookies over verschillende 'domeinen' gaat niet, ook al is het dezelfde computer.

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


  • Jabbah
  • Registratie: Februari 2004
  • Laatst online: 21-05 11:01
curry684 & P_de_B: Ik redirect naar een relatieve URL, dus iets van Response.Redirect("test.aspx")

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

En werkt het wel als je handmatig via Response.Cookies een cookie meegeeft?

Professionele website nodig?


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
curry684 schreef op 14 juni 2004 @ 10:35:
En werkt het wel als je handmatig via Response.Cookies een cookie meegeeft?
Of: werkt het wel als je redirect naar "http://wks_dev_03/test/test.aspx" ?

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


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:33
En als je een postback doet naar dezelfde pagina , wat dan?

Volgens mij zal dat ook niet werken; bij een postback of redirect zal -denk ik- die hashtable opnieuw ge'newed worden, en ben je alles kwijt.

https://fgheysels.github.io/


  • Jabbah
  • Registratie: Februari 2004
  • Laatst online: 21-05 11:01
Postback naar zelfde pagina -> werkt niet
Redirect naar http://wks_dev_03/test/test.aspx -> werkt niet

Ik weet niet hoe je handmatig een cookie meegeeft. Heb ik me nog niet in verdiept. Maar je moet toch gewoon de sessie kunnen blijven behouden??

Voor alle volledigheid hier eens de code:

WebForm1.aspx:
code:
1
2
3
4
5
private void Button1_Click(object sender, System.EventArgs e)
{
    Session["test"] = "blah";
    Response.Redirect("test.aspx");
}

test.aspx:
code:
1
2
3
4
private void Page_Load(object sender, System.EventArgs e)
{
    Label1.Text = Session["test"].ToString();
}

web.config:
code:
1
2
3
4
5
6
7
    <sessionState 
            mode="InProc"
            stateConnectionString="tcpip=127.0.0.1:42424"
            sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
            cookieless="false" 
            timeout="20" 
    />

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:33
Je hebt die problemen dus met de 'gewone' session state en niet met je eigen 'systeem'?

Accepteer je misschien geen cookies ?

https://fgheysels.github.io/


  • Jabbah
  • Registratie: Februari 2004
  • Laatst online: 21-05 11:01
whoami schreef op 14 juni 2004 @ 15:28:
Je hebt die problemen dus met de 'gewone' session state en niet met je eigen 'systeem'?

Accepteer je misschien geen cookies ?
Jawel.. hij staat op 'Accept all cookies'..
Pagina: 1