[ASP.NET] global.asax session variables

Pagina: 1
Acties:
  • 117 views sinds 30-01-2008
  • Reageer

  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
Ik heb een klasse in global.asax gedefinieerd die een sessie variabele moet wegschrijven. Nu krijg ik als ik

code:
1
Session("test") = "test"


in deze klasse zet, de foutmelding "Session not defined".

Doe ik:

code:
1
2
Dim Session as SessionState.HttpSessionState
Session("test") = "test"


Krijg ik:

Reference Session not set to an instance..

Wat doe ik fout? In normale aspx pagina's kan ik gewoon session variables setten. :?

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
In princiepe kan je in je global.asax.cs ( In jouw geval waarschijnlijk global.asax.vb ) gewoon de Session gebruiken ( In bepaalde omstandigheden, want in de Sommige event handlers is je Session niet beschikbaar maar daar krijg je netjes een melding van dat je session in die context niet geldig is ) want het is een SubClass van HttpApplication.

Bij je 2e stukje code gaat het zowiezo verkeerd Want je Defineert eerst een HttpSessionState object en voor de rest assign je geen werkelijk object aan deze variabele dus Session is in dit geval null.

Laat anders eens wat meer van je code zien want ik vind deze zin nogal raar
Ik heb een klasse in global.asax gedefinieerd
op zich klopt het wel maar ik heb het idee dat je wat anders doet als je normaal in de global.asax class doet

[ Voor 19% gewijzigd door Woy op 19-09-2003 10:16 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Logisch.

Een gewone class kan niet aan de Session. Wie zegt dat die class nl. altijd in webapplicaties zal gebruikt worden?

Je kan je class wel een bepaalde waarde laten returnen die jij dan in de Session van de applicatie waarin ze gebruikt wordt bewaard.

[ Voor 35% gewijzigd door whoami op 19-09-2003 10:22 ]

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Je moet ook HttpContext.Current nemen.
whoami schreef op 19 September 2003 @ 10:21:
Een gewone class kan niet aan de Session. Wie zegt dat die class nl. altijd in webapplicaties zal gebruikt worden?

Je kan je class wel een bepaalde waarde laten returnen die jij dan in de Session van de applicatie waarin ze gebruikt wordt bewaard.
Waarom kan ik in een willekeurige class geen sessions aanroepen? Dat is niet gelimiteerd aan een klasse, welke Page / Usercontrol inherit.

Je kan echter wel vreemde effecten krijgen als je deze laadt in een ander type applicatie.

[ Voor 120% gewijzigd door gorgi_19 op 19-09-2003 10:25 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
whoami schreef op 19 September 2003 @ 10:21:
Logisch.

Een gewone class kan niet aan de Session. Wie zegt dat die class nl. altijd in webapplicaties zal gebruikt worden?
Ja inderdaad dat bedoelde ik ook, maar opzich klopt het wel dat je een class in je global.asax defineerd maar die erft van HttpApplication en laat Session nou net een property van HttpApplication zijn.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
Excuses voor de wel erg late reply. Ok, ik kom er dus nog steeds niet uit. Hier een gedeelte van mijn code in global.asax.vb:

code:
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
Namespace RoleSecurity
    Public Class UserHelpers
        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        ' Returns an Array of user roles for a given username
        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        Public Shared Function GetUserRoles(ByVal username As String) As String()

            ' Create a string to persist the roles
            Dim roleStr() As String
            Dim userRoles As New ArrayList()
            ' Get the roles for this user from the database
            Dim objConn As New OleDbConnection(ConfigurationSettings.AppSettings("sConn"))
            Dim objCmd As New OleDbCommand()
            Dim objGetUserRolesCmd As New OleDbCommand()
            Dim sGetUserRolesSQL As String
            objConn.Open()
            sGetUserRolesSQL = "SELECT Roles.RoleName as RoleName FROM (Users INNER JOIN User_roles ON Users.Id = User_roles.user_id) INNER JOIN Roles ON User_roles.role_id = Roles.id WHERE (((Users.UserName)='" & Replace(username, "'", "''") & "'));"
            objGetUserRolesCmd.Connection = objConn
            objGetUserRolesCmd.CommandText = sGetUserRolesSQL
            Dim UserRolesReader As OleDbDataReader = objGetUserRolesCmd.ExecuteReader()

            While UserRolesReader.Read
                userRoles.Add(UserRolesReader("RoleName"))
            End While

            objConn.Close()

            ' Return the Array of roles to the caller
            roleStr = CType(userRoles.ToArray(GetType(String)), String())
            Return roleStr

        End Function    ' GetUserRoles
        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        ' Returns True if username and password combination are found in the
        ' Users table in the database
        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        Public Shared Function AuthenticateUser(ByVal username As String, ByVal password As String) As Boolean

            Dim result As Boolean = False
            Dim objConn As New OleDbConnection(ConfigurationSettings.AppSettings("sConn"))
            Dim objCmd As New OleDbCommand()
            Dim CurrentDate As New Date()
            Dim objAuthenticateUserCmd As New OleDbCommand()
            Dim sAuthenticateUserSQL As String
            objConn.Open()
            sAuthenticateUserSQL = "SELECT Users.Password, Users.AccountExpires as AccountExpires, Users.ID As userid FROM Users WHERE (((Users.UserName)='" & Replace(username, "'", "''") & "'));"
            objAuthenticateUserCmd.Connection = objConn
            objAuthenticateUserCmd.CommandText = sAuthenticateUserSQL
            Dim AuthenticateUserReader As OleDbDataReader = objAuthenticateUserCmd.ExecuteReader()

            If AuthenticateUserReader.Read Then
                If AuthenticateUserReader("AccountExpires") Is Convert.DBNull Then
                    'No expiration set for this account
                    If AuthenticateUserReader("Password") = password Then
                        result = True
                    End If
                Else
                    'There is an expiration date set, check if the account is not expired yet
                    If Convert.ToDateTime(AuthenticateUserReader("AccountExpires")) > System.DateTime.Now Then
                        If AuthenticateUserReader("Password") = password Then
                            result = True
                        End If
                    End If
                End If
            End If
            objConn.Close()
            If (result = True) Then 'If user is authenticated set session with userid
                Session("sUserId") = result
            End If
            Return result
        End Function    ' AuthenticateUser
    End Class
End Namespace 'RoleSecurity


Het gaat hier om de 6e regel van onderen, hier geeft vb "Reference to a non-shared member requires an object reference"

Misschien probeer ik dit probleem met een verkeerde oplossing op te lossen; wat ik eigenlijk wil is de userid op kunnen vragen, en aangezien ik in mijn login.asp.vb de volgende code heb:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
        If username.Text <> "" And password.Text <> "" Then
            If RoleSecurity.UserHelpers.AuthenticateUser(username.Text, FormsAuthentication.HashPasswordForStoringInConfigFile(password.Text, "SHA1")) Then
                ' entry found
                FormsAuthentication.SetAuthCookie(username.Text, False)
                'ErrorMessage.InnerHtml = "Login succeeded! " & User.Identity.IsAuthenticated
                FormsAuthentication.RedirectFromLoginPage(username.Text, False)
            Else
                ' entry not found
                ErrorMessage.InnerHtml = sErrorMessage
            End If
        Else
            ErrorMessage.InnerHtml = sErrorMessage 'One of the two fields is empty
        End If


En dus eigenlijk alleen maar een auth cookie heb met de username, en niet de unique id, wilde ik een sessie setten met daarin die userid, zit ik in een te moeilijke richting te denken?

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
gorgi_19 schreef op 19 September 2003 @ 10:21:
Je moet ook HttpContext.Current nemen.
Het antwoord is dus al gegeven

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
rwb schreef op 22 September 2003 @ 20:42:
[...]

Het antwoord is dus al gegeven
Ok dus even iets beter uitgelegd graag..?

Doe ik dit:

code:
1
Dim Session("sUserId") As HttpContext.Current = result


Krijg ik : "HttpContext.Current is not defined" ..:?

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Hint 1: Kijk eens naar de properties van HttpContext.Current.
Hint 2: Nee, het is geen class die je kan gebruiken als type.

[ Voor 36% gewijzigd door gorgi_19 op 22-09-2003 20:46 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
gorgi_19 schreef op 22 September 2003 @ 20:46:
Hint 1: Kijk eens naar de properties van HttpContext.Current.
Hint 2: Nee, het is geen class die je kan gebruiken als type.
HttpContext.Current.Session("sUserId") = result, thanx!

  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
Erg vaag... In mijn global.asax werken de sessies nu wel, ik kan ze ook opvragen, maar als ik een session variable opvraag buiten de global.aspx, in een vb codebehind, dan is die variable leeg...
Current.Session("sUserName") is dan dus opeens: "", hoe kan dit?

[ Voor 6% gewijzigd door UniCache2 op 29-09-2003 15:18 ]


  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
Even ter verduidelijking;

Ik gebruik in mijn global.asax dus:

code:
1
Current.Session("sUserName") = sUsername


Als ik tijdens het debuggen de waarde van deze sessie bekijk is ie ook gevuld met de goede username. Na het inloggen redirect ik naar default.aspx, vraag de sessie op:

code:
1
lblUsername.Text = Current.Session("sUserName")


En die is dan gewoon leeg :?

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
In C# zijn de namen van sessie-variabelen case-sensitive, ik weet niet of dat in VB.NET ook zo is, maar ik vermoed van wel.
Ben je dus wel zeker dat je iedere keer de juiste (consistente) casing gebruikt?

https://fgheysels.github.io/


  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
whoami schreef op 30 september 2003 @ 09:59:
In C# zijn de namen van sessie-variabelen case-sensitive, ik weet niet of dat in VB.NET ook zo is, maar ik vermoed van wel.
Ben je dus wel zeker dat je iedere keer de juiste (consistente) casing gebruikt?
Ik weet zeker dat ik de juiste casing heb gebruikt. Naar mijn weten is VB.NET niet case sensitive, C# idd wel.

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
UniCache2 schreef op 30 September 2003 @ 10:17:
[...]


Ik weet zeker dat ik de juiste casing heb gebruikt. Naar mijn weten is VB.NET niet case sensitive, C# idd wel.
Waar (in welke event-handler) laad je die sessie-var's op, en wanneer bewaar je ze opnieuw?

https://fgheysels.github.io/


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Waarschijnlijk gebruik je de session dus in een andere context. Je bent dus vars in een ander session object aan het stoppen dan het Session object die je later gebruikt. Zoals al eerder gezegd, het Session object is niet in alle stadia van een Request beschikbaar. Probeer maar eens in de Application_BeginRequest ( weet ff niet precies de naam ) de regel
C#:
1
Session[ "naampje" ] = "test";

neer te zetten dan krijg je netjes een melding dat je Session niet beschikbaar is op dat moment.
Naar mijn weten is VB.NET niet case sensitive, C# idd wel.
VB.NET is volgens mij inderdaad niet case sensitive als het op variabelen aankomt. Maar de naam die je met je als key met je Session meegeeft is wel degelijk Case sensitive want dit heeft gewoon dezelfde code erachter zitten als dat je het Session object in C# gebruikt

[ Voor 28% gewijzigd door Woy op 30-09-2003 10:30 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
Ok ik ga er nu maar van uit dat dit niet is op te lossen op de manier waarop ik dat wil. Ik begrijp nog steeds niet waarom ik niet gewoon vanuit mijn namespace in global.asax een sessie kan zetten en deze niet op kan vragen in default.aspx.vb...

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
UniCache2 schreef op 30 September 2003 @ 10:55:
Ok ik ga er nu maar van uit dat dit niet is op te lossen op de manier waarop ik dat wil. Ik begrijp nog steeds niet waarom ik niet gewoon vanuit mijn namespace in global.asax een sessie kan zetten en deze niet op kan vragen in default.aspx.vb...
Nogmaals het gaat er niet om in welke file je de namespace zet maar het gaat erom in welke status de Request verkeerd of je Session kan gebruiken. Je hebt volgens mij nog steeds niet echt duidelijk verteld wat je wilt bereiken. Als je dat niet doet kunnen wij je ook niet echt helpen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
rwb schreef op 30 september 2003 @ 12:42:
[...]

Nogmaals het gaat er niet om in welke file je de namespace zet maar het gaat erom in welke status de Request verkeerd of je Session kan gebruiken. Je hebt volgens mij nog steeds niet echt duidelijk verteld wat je wilt bereiken. Als je dat niet doet kunnen wij je ook niet echt helpen.
Ik heb toch echt alle code plus uitleg gepost, hier een kleine smanvatting:

Namespace in global.asax, welke wordt aangroepen vanaf login.aspx.vb, controleerd of een gebruiker ingelogd is, zo ja, zet hij o.a. een sessie variabele met de gebruikersnaam. Hierna redirect hij naar default.aspx.vb, welke die sessie weer opvraagt. Deze is op dat moment leeg, terwijl hij in de namespace wel noggevuld was.. Wat moet er duidelijker? (nofi O-) )

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
mmm als ik het zo lees zou het denk toch wel moeten werken. Kan je vlak voordat je die methode aanroept in je login page ( In je ok Button handler neem ik aan ) wel je Session benarderen? Zoja dan zou het ook mogelijk moeten zijn om deze in de methode die je aanroept te benaderen met HttpContext.Current.Session. Anders kan je een proberen om je Session object als parameter mee te geven aan de methode en kijken of het dan wel werkt.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
Ik kan inderdaad wel een sessie in login.aspx.vb setten en deze opvragen in default.aspx, maar als ik in login.aspx.vb een sessie zet in de namespace die in de global.asax.vb staat, dan kan ik die niet opvragen in mijn default.aspx :?
Ik gebruik nu overal HttpContext.Current.Session("") in plaats van alleen Session(""), en nog werkt het niet!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Als je ergens Session[ "key" ] gebruikt is dat exact hetzelfde als HttpContext.Current.Session[ "key" ]. Het lijkt er dus op dat je toch in een andere context zit. Probeer dan dus eens aan die methode in de Global.asax het Session object mee te geven. Dan weet je ieder geval zeker dat je de goede Session hebt. Probeer ook eens door je code te steppen dan kan je alles een keer duidelijk bekijken.

[ Voor 16% gewijzigd door Woy op 30-09-2003 15:04 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
code:
1
Public Shared Function AuthenticateUser(ByVal username As String, ByVal password As String) As Boolean


Wordt dan dus zoiets:
code:
1
Public Shared Function AuthenticateUser(ByVal username As String, ByVal password As String, ByVal  session As HttpContext) As Boolean


Ik kan het hier niet proberen, maar zal het straks testen..

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Waar ben jij mee bezig? :?

Ik heb zo een donkerbruin vermoeden dat je het wiel opnieuw aan het uitvinden bent met authenticatie.

En noem dat ding ajb geen session, als je tenminste niet voor nog meer verwarring wil zorgen.

[ Voor 28% gewijzigd door gorgi_19 op 30-09-2003 16:11 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je zult hem zowiezo niet als ByVal door moeten geven. Je moet een reference doorgeven dus waarchijnlijk iets van ByRef.
In C# zou het ieder geval zoiets zijn
C#:
1
2
3
4
public bool AuthenticateUser( string username, string password, HttpSessionState session )
{
    //Hier je code
}
Waar ben jij mee bezig? :?

Ik heb zo een donkerbruin vermoeden dat je het wiel opnieuw aan het uitvinden bent met authenticatie.

En noem dat ding ajb geen session, als je tenminste niet voor nog meer verwarring wil zorgen.
Ja dat gevoel heb ik ook een beetje, daarom vroeg ik ook of hij wou uitleggen wat hij precies wou bereiken en eigenlijk niet wat hij wou doen.

Als het gewoon over Authentication gaat moet je eens naar Forms Authentication kijken.

[ Voor 48% gewijzigd door Woy op 30-09-2003 16:14 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
Ok mijn laatste post sloeg waarschijnlijk nergens op, en ik weet dat jullie het niet willen voorkauwen, maar ik weet het gewoon niet meer, moet ik dat nog vaker zeggen? Ik heb toch echt al mijn code gepost, in een van de eerste posts, en daar kun je zien dat ik bezig ben met role based authorization, forms authentication op zich werkt allemaal prima, maar ik wil de userid meegeven, het liefst in een sessie, zodat ik die kan gebruiken om de user roles op te halen. Ik probeer het wiel niet opnieuw uit te vinden, ik weet echter wel dat ik het op een omslachtige manier doe, en aangezien ik het graag op de beste manier doe, hoor ik graag van jullie hoe ik het wel moet doen. rwb zei dat ik het session object mee moest geven in de methode in global.asax.vb, zodat ik zeker weet dat ik de goede session heb. Deze probeerde ik dus in mijn laatste post mee te geven, klaarblijkelijk dus niet op de goede manier.. Mijn vraag is dus nogmaals: Hoe doe ik dit op de goede manier? Ik heb mijn code gepost, ik heb uitgelegd wat ik wil, dus ga nu niet weer vertellen dat ik niet genoeg informatie geef, ik hoor graag van jullie wat je voor extra informatie wilt hebben. Nogmaals mijn vraag:

- global.asax.vb NameSpace RoleSecurity
HttpContext.Current.Session("blabla") = "test"
Ophalen van HttpContext.Current.Session("blabla") : "test"

- Login.aspx.vb
Ophalen van HttpContext.Current.Session("blabla") : ""

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

rwb schreef op 30 september 2003 @ 16:11:
Je zult hem zowiezo niet als ByVal door moeten geven. Je moet een reference doorgeven dus waarchijnlijk iets van ByRef.
In C# zou het ieder geval zoiets zijn
C#:
1
2
3
4
public bool AuthenticateUser( string username, string password, HttpSessionState session )
{
    //Hier je code
}
Ik vraag me af of dat ByRef zin heeft. Voor zover ik weet heeft VB.Net iig een schurfthekel aan en kost het iets meer resources zelfs dan een byval (omdat ByRef intern iets anders wordt behandeld dan een ByRef in andere talen). Ik weet niet of het .Net of VB.Net afhankelijk is.

Verder vraag ik me ook af of je uberhaupt een Current Sessionstate moet doorgeven; je hebt er in principe maar 1 van en ik zou even moeten nazoeken of dit een singleton is of niet (zou me erg verbazen als dit niet het geval is).

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
gorgi_19 schreef op 01 October 2003 @ 10:08:
[...]

Ik vraag me af of dat ByRef zin heeft. Voor zover ik weet heeft VB.Net iig een schurfthekel aan en kost het iets meer resources zelfs dan een byval (omdat ByRef intern iets anders wordt behandeld dan een ByRef in andere talen). Ik weet niet of het .Net of VB.Net afhankelijk is.

Verder vraag ik me ook af of je uberhaupt een Current Sessionstate moet doorgeven; je hebt er in principe maar 1 van en ik zou even moeten nazoeken of dit een singleton is of niet (zou me erg verbazen als dit niet het geval is).
Ja ik weet nietzoveel van VB.NET af maar ik dacht dat als je ByVal doorgeeft dat je dan een kopie maakt van het object ( Beetje uit de c/c++ gedachte ). En dat van de Session doorgeven is inderdaad eigenlijk niet de oplossing, maar blijkbaar gaat er iets mis met het opvragen van de current Session dus was mijn idee om even te kijken waar het mis gaat door vanuit je login.aspx een reference ( vandaar dat ik ByRef zeg ;) in C# heb je namelijk niet zoiets als een ByRef of ByVal keyword ) door te geven van je Session ( Hier werkt hij ieder geval wel dus je weet dat je de goede reference hebt )

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

rwb schreef op 01 oktober 2003 @ 11:32:
[...]

Ja ik weet nietzoveel van VB.NET af maar ik dacht dat als je ByVal doorgeeft dat je dan een kopie maakt van het object ( Beetje uit de c/c++ gedachte ). En dat van de Session doorgeven is inderdaad eigenlijk niet de oplossing, maar blijkbaar gaat er iets mis met het opvragen van de current Session dus was mijn idee om even te kijken waar het mis gaat door vanuit je login.aspx een reference ( vandaar dat ik ByRef zeg ;) in C# heb je namelijk niet zoiets als een ByRef of ByVal keyword ) door te geven van je Session ( Hier werkt hij ieder geval wel dus je weet dat je de goede reference hebt )
Bij mij werkt het in vb.net iig ook, met op bepaalde plekken, waar Session nog niet beschikbaar is, deze aanroepen via HTTPContext.Current, en in de overige gevallen gewoon Session gebruiken.

Over ByRef en ByVal, de externe werking is exact hetzelfde. Alleen was het niet zo dat ByRef beter was dan een ByVal, omdat er alleen een reference gemaakt werd.
This is another scenario that needs a mention here. In VB.NET there are two ways in which we can call a function or procedure, viz, by Value or by Reference. The default being Call by Value (Note: In VB6 the default is call by Reference.)

Passing a parameter by Reference means that if changes are made to the value of a variable passed, these changes are reflected back in the calling routine.

Objects are Reference type data. They maintain a reference to where the actual data is stored on the stack. Normally what occurs when an object is passed by reference is that this memory pointer from the stack is passed to the function or procedure. As a result of only passing a pointer to the referenced data, the function or procedure has access to the original data.

However, VB.NET does not follow this model. When an object's property is passed by reference to a function or procedure, the data is copied. Not only is the data copied, but since by definition variables passed by reference allow for the return of changes, the data is copied back. Thus, while most implementation avoid copying the data when a variable is passed by reference, VB.NET actually passes it twice -- a large performance hit on a function call that passes data by reference.

Therefore the ByRef option will use more of the System Resources as the parameter data is copied in for use by the function and then copied back to its original location. On the other hand, ByVal only copies the data once. When considering how to pass parameters this should be kept in mind, and the ability to return data as part of the function as opposed to ByRef alternative should be considered.

[ Voor 47% gewijzigd door gorgi_19 op 01-10-2003 11:46 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Ow ja, nog voor de topicstarter:

Imho blijft het volstrekt onzinnig om een username mee te sturen. Die paar enkele keren dat je username gebruikt.. :P

Imho kan je veel beter je UserID opslaan als Username in je Forms Authentication. Heb je ook niet het probleem met wijzigingen van username. Verder kan je zo makkelijker 'ingelogged' blijven dmv cookies.

Verder ga je op dit moment weer iets te makkelijk om, imho met Httpcontext.Current. Ik gebruik deze alleen indien er niet standaard verwezen wordt naar HTTPContext.Current, dus als ik niet in een class zit, afgeleid van UserControl of Page.

[ Voor 27% gewijzigd door gorgi_19 op 01-10-2003 12:00 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
gorgi_19 schreef op 01 October 2003 @ 11:59:
Imho blijft het volstrekt onzinnig om een username mee te sturen. Die paar enkele keren dat je username gebruikt.. :P
Inderdaad, maar het is beter om deze in een sessie op te slaan dan steeds een roundtrip naar de db te moeten maken om alleen de naam ff op te halen
Imho kan je veel beter je UserID opslaan als Username in je Forms Authentication. Heb je ook niet het probleem met wijzigingen van username. Verder kan je zo makkelijker 'ingelogged' blijven dmv cookies.
Heb ik inderdaad al aangepast, id is veel makkelijker. Ik heb de bovenstaande code alleen nog niet geupdate hier, omdat dat niet de essentie van mijn probleem is. Ik heb nog steeds de naam van de user in een session variable nodig.
Verder ga je op dit moment weer iets te makkelijk om, imho met Httpcontext.Current. Ik gebruik deze alleen indien er niet standaard verwezen wordt naar HTTPContext.Current, dus als ik niet in een class zit, afgeleid van UserControl of Page.
Klopt. Ik heb het nu om te debuggen even zo gedaan (kan geen kwaad toch?), maar het werkt nu nog steeds niet, terwijl ik overal dezelfde context lijk te gebruiken.. Erg vreemd, maar ik denk dat er niks anders op zit dan telkens een roundtrip naar de db te maken voor de username, of zijn er nog andere suggesties?

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Waarom doe je niet gewoon zo in je login.aspx
C#:
1
2
3
4
5
6
7
public void BtnLogin_Click( object sender, EventArgs e )
{
    //validate hier je user enzo en haal data op uit je DB
    Session[ "UserName" ] = userName;
    //Stop hier nog zoveel in je session als nodig
    FormsAuthentication.RedirectFromLoginPage( userName, [ true | false ] );
}
Over ByRef en ByVal, de externe werking is exact hetzelfde. Alleen was het niet zo dat ByRef beter was dan een ByVal, omdat er alleen een reference gemaakt werd.
Ja ik heb het ook nog ff in de docs gelezen en het is bijna hetzelfde als het ref keyword in C# ( blijkbaar alleen wel anders geimplementeerd waardoor je een performance hit krijgt in VB.NET ).
C#:
1
2
3
4
5
6
public void test( ref string test )
{
    test = "test";
}
string testString = "blaat";
test( ref testString );

waar testString na de call de waarde "test" heeft en als je het zonder ref had gedaan kan je test niet assignen in je method test.

Weer wat geleerd over VB.NET vandaag ;)

[ Voor 50% gewijzigd door Woy op 01-10-2003 18:13 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
rwb schreef op 01 oktober 2003 @ 18:10:
Waarom doe je niet gewoon zo in je login.aspx
C#:
1
2
3
4
5
6
7
public void BtnLogin_Click( object sender, EventArgs e )
{
    //validate hier je user enzo en haal data op uit je DB
    Session[ "UserName" ] = userName;
    //Stop hier nog zoveel in je session als nodig
    FormsAuthentication.RedirectFromLoginPage( userName, [ true | false ] );
}
Omdat ik de authorizatie en authenticatie code niet op 1 plek wil hebben, ik gebruik hem namelijk ook in andere bestanden, aangezien ik van role based security gebruik maak kunnen gebruikers in verschillende gedeeltes van mijn site inloggen, en afhankelijk van hun role wel of niet in dat gedeelte toegelaten worden. Het is dan handiger om die code in mijn global.asax te hebben zodat ik hem overal kan aanroepen.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

UniCache2 schreef op 02 October 2003 @ 09:18:
[...]


Omdat ik de authorizatie en authenticatie code niet op 1 plek wil hebben, ik gebruik hem namelijk ook in andere bestanden, aangezien ik van role based security gebruik maak kunnen gebruikers in verschillende gedeeltes van mijn site inloggen, en afhankelijk van hun role wel of niet in dat gedeelte toegelaten worden. Het is dan handiger om die code in mijn global.asax te hebben zodat ik hem overal kan aanroepen.
:?

2 vragen:
1. Waarom denk je dat ASP.Net 1 centrale loginpage ondersteunt, met de optie in Forms authentication RedirectFromLoginPage?
2. Beschouw het eens vanuit een custom login component, welke reusuable is. Waarom niet die benadering?

* gorgi_19 krijgt het idee dat er ingegaan wordt tegen de standaard implementatie van ASP.Net.

[ Voor 8% gewijzigd door gorgi_19 op 02-10-2003 09:20 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
gorgi_19 schreef op 02 October 2003 @ 09:19:
[...]
2 vragen:
1. Waarom denk je dat ASP.Net 1 centrale loginpage ondersteunt, met de optie in Forms authentication RedirectFromLoginPage?
Ja daar heb je gelijk in, het kan misschien allemaal in 1 login page, probleem is echter dat de ene pagina een compleet verschillende layout heeft dan de andere login pagina, inclusief andere velden etc. Vandaar dat ik het destijds op deze manier wilde oplossen, zodat het authorizatie script totaal onafhankelijk van de loginpagina is.. Nogmaals, het zou idd op 1 pagina kunnen
2. Beschouw het eens vanuit een custom login component, welke reusuable is. Waarom niet die benadering?
Precies waar ik naar toe wil. Ik dacht dat het op deze manier de beste oplossing was om hem zo goed mogelijk reusable te maken, blijkbaar niet, hoe dan wel?

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

UniCache2 schreef op 02 October 2003 @ 09:30:
Ja daar heb je gelijk in, het kan misschien allemaal in 1 login page, probleem is echter dat de ene pagina een compleet verschillende layout heeft dan de andere login pagina, inclusief andere velden etc. Vandaar dat ik het destijds op deze manier wilde oplossen, zodat het authorizatie script totaal onafhankelijk van de loginpagina is.. Nogmaals, het zou idd op 1 pagina kunnen
Als eerste veronderstellen we een complete scheiding tussen data en layout. Data is generiek, layout verschillend. Nu alleen nog achterhalen welke layout we moeten kiezen
Er wordt normaliter een querystring meegestuurd, met de pagina waar men vandaan kwam. Vang deze af en geef door middel van een factory de juiste template terug. Zo kan je in een .aspx een custom .ascx pagina laden, met de betreffende layout, maar zonder een codebehind.
Precies waar ik naar toe wil. Ik dacht dat het op deze manier de beste oplossing was om hem zo goed mogelijk reusable te maken, blijkbaar niet, hoe dan wel?
Maak een aparte .ascx bestand voor het inloggen, evt. kan je het ook helemaal in de code-behind doen, waarna je met page.Loadcontrol de template kan laden. Sowieso moet je dan inheriten van UserControl. Hierin kan je vervolgens alle code neerzetten die je wilt en nodig zijn voor het inloggen. Deze control kan je vervolgens kwijt op meerdere plaatsen.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
UniCache2 schreef op 02 October 2003 @ 09:18:
[...]
Het is dan handiger om die code in mijn global.asax te hebben zodat ik hem overal kan aanroepen.
Gorgi_19 heeft het meeste al gezegd maar hoezo ga je ervan uit dat als je code niet in je Global.asax staat dat je het niet kan aanroepen. Als ik in een los bestand bijvoorbeeld een class aanmaak met methodes kan ik deze perfect gebruiken in de rest van mijn code.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1