Avatar billede fasterlars Nybegynder
02. august 2010 - 15:45 Der er 11 kommentarer og
1 løsning

asp.net brugersessioner - hvordan?

Hej.

Jeg skal til at lave mit første "større" asp.net projekt, men har nogle problemer med at forstå hvordan man håndterer brugersessioner.

Lad os sige at en bruger tilgår Default.aspx, som opretter en instans af, f.eks. DatabaseConnection.cs. Denne database klasse returnerer noget information, og ligeledes bliver nogle variable sat i denne klasse.

Når så Default.aspx videresender brugeren til EnAndenSide.aspx, hvordan skal man så tilgå denne instans af DatabaseConnection for at kunne tilgå de variable der blev gemt før? Alt bliver jo tabt efter postback.
Jeg kan dårligt tro at man gemmer disse instancer i Sessions variablen, da dette hurtigt vil kræve et alt for kraftigt ressourceforbrug?

Tak for jeres tid :)

Mvh
Lars
Avatar billede keysersoze Guru
02. august 2010 - 16:51 #1
web er stateless, så medmindre du kan gemme dine informationer i fx sessions- eller applicationsvariabler går alt tabt mellem request. Dette betyder også at alt du ikke gemmer skal oprettes igen, hentes ud af databasen igen, genberegnes eller hvad du end har behov for.

Det er umiddelbart lidt svært ud fra de oplysninger du kommer med at vurdere den rigtige tilgang til det, men kommer du fra windows-udvikling kan du lige så godt vænne dig til at det kræver mere databasearbejde osv at arbejde på web - så mener du ikke at du kan gemme informationerne i en eller flere sessions må du lave en ny instans og lave dine variabler igen.
Avatar billede fasterlars Nybegynder
02. august 2010 - 17:13 #2
Tak for svaret!

Altså det er mig intet problem at skulle have meget kontakt til databasen, og hive informationer ud ofte.
Men jeg har f.eks. en klasse der holder styr på den pågældende brugers rettigheder og andre informationer om brugeren. Denne instans skal jeg altid kunne referere til.

Bortset fra dette, er den almindelige fremgangsmåde så at oprette nye instanser af klasser på hver eneste side man er på? Det virker en anelse tosset :)
Avatar billede keysersoze Guru
02. august 2010 - 17:27 #3
Når nu du taler rettigheder, så har du ikke overset membership-provideren vel?

En bruger med rettigheder lyder som noget man sagtens kunne gemme i en session - men det mest sikre i mine øjne må være at lave opslaget for hver side. Det er selvfølgelig tungt og kan virke tosset - men det er måden et stateless miljø arbejder på.
Avatar billede fasterlars Nybegynder
02. august 2010 - 18:02 #4
Uden at have særligt godt kendskab til .net´s membership provider, tror jeg ikke det er noget jeg kan bruge i mit tilfælde.
Jeg har nemlig 2 datakilder, den ene indeholder bruger informationer, såsom username, password, hvilke data brugeren har rettighed til at se mm. Den anden datakilde indeholder netop denne data brugeren er interesseret i.

Jeg havde så tænkt mig at denne UserControl klasse skulle indeholde informationer om brugerens rettigheder, og have åbne forbindelser til disse 2 datakilder. Dvs. at hvis jeg gemmer denne UserControl instans i brugerens Session, kommer det let til at blive tungt.

Hvis jeg derimod unlader dette, skal jeg hver eneste gang jeg har brug for data på en side, oprette en instans af UserControl, som dernæst skal oprette nye instanser/forbindelser til de 2 datakilder, virker det en anelse omsonst :)

Jeg tør slet ikke forestille mig hvordan store systemer hænger sammen i web!

Bortset fra det skal du have mange tak for din feedback :)
Avatar billede keysersoze Guru
03. august 2010 - 01:05 #5
Du kan sagtens benytte membership-provideren med flere datakilder - det er et afgrænset system i sig selv, hvordan du vælger at benytte det og evt integrere med andre ting er helt op til dig. En anden diskution er så at det set udefra ikke umiddelbart giver mening at have 2 forskellige datakilder da 1 burde være tilstrækkeligt, men det har sikkert sine grunde.

Det gælder altid om at lukke forbindelsen til en datakilde så hurtigt som muligt - det gælder web som windows.

Igen kender jeg ikke dit setup nærmere, men at gemme en brugers oplysninger i en session lyder ikke af meget data - men du bør under alle omstændigheder alligevel validere brugerens oplysninger når data hentes/vises en side og det bør derfor være tilstrækkeligt at gemme et simpelt objekt, måske endda kun et ID på brugeren.

Der kører masser af store web-systemer uden problemer - kig bare på qxl, dba osv og der er da ingen tvivl om at det kræver omtanke at få sådan noget til at køre men selvfølgelig kan det da lade sig gøre.
Avatar billede fasterlars Nybegynder
03. august 2010 - 07:14 #6
Tak for dit svar!
Jeg vil prøve at se nærmere på den membership provider så. Og prøve at arbejde videre med blot at gemme brugeroplysninger i sessionen.

Dog har jeg lige et par allersidste spørgsmål:
Vil det sige at på hver enkelt side brugeren er inde på, skal oprette spritnye instanser af disse datakilde forbindelses klasser, eller andre klasser der måtte være nødvendige? Og vil det gøre nogen forskel at benytte sig af statiske klasser/metoder? Eller singleton?

Tusind tak for din tid :)
Avatar billede keysersoze Guru
03. august 2010 - 09:59 #7
Du får det til at lyde som om dine connections er specielt ekstra tunge i forhold til normalen - en connection er selvfølgelig relativt tung men ud fra hvad du fortæller også nødvendig uanset om du sætter noget til static.

Alt afhængig af hvad du arbejder med at data vil en mulighed måske være at kigge på caching.
Avatar billede janus_007 Nybegynder
03. august 2010 - 10:08 #8
Hej fasterlars

Det forholder som som keysersoze forklarer, altid forsøge at holde dine data connections så kortvarige som mulige. Når du har fået hvad du skal have, så lukker du forbindelsen igen. Det forholder sig faktisk sådan at hvis du bruger en datareader og genbruger denne vil du få en lock :)

Og ja.. enhver bruger skal oprette spritnye instanser af hvad der nu må være nødvendigt for at servere indholdet.

Der er dog nogle forbehold/ tips/ tricks til ovenstående.
Alt afhængig af hvad behovet er kan det betale sig at holde forbindelsen åben til db'en, det gælder eks.vis når man skal indsætte mange rækker enkeltvis - det er et sjældent behov, men altså ingen regler uden undtagelser :) Det kan også løses på andre måder, men igen.. afhængig af kravet til persistering.

Og spritnye instanser; når du kommer lidt mere ind i .NET så tag et kig på caching koncepter.

Jeg kan næsten regne ud at noget af din forundring ligger i performanceforbruget på at håndtere alle de class instanciations, men vær ikke bekymret :)
Avatar billede fasterlars Nybegynder
03. august 2010 - 10:38 #9
Tak for jeres svar.

Det kan godt være jeg skal slappe lidt af med min bekymring om performance. Så meget data er der heller ikke tale om der skal holdes på.
Jeg vil snuse lidt til caching.

Tak :)
Avatar billede keysersoze Guru
03. august 2010 - 10:48 #10
Det i mine øjne vigtigste er at kode rigtigt - dvs fx sørge for ikke kun at connections lukkes hurtigst muligt men at de i det hele taget bliver lukket uanset hvad der end måtte ske af ventede og uventede ting i applikationen. Det samme gælder andre readere, objekter etc det er muligt at lukke.
Avatar billede janus_007 Nybegynder
04. august 2010 - 21:44 #11
Jeg ved ikke lige om det var til mig keysersoze, men hvis det er, så ja, helt enig.

At holde connections åbne kræver erfaring og viden om hvad man laver og hører sig jo absolut ikke hjemme i en webapp, men kunne sagtens komme på tale i en winapp alt afhængig af hvad man vil opnå.

Det er kun tåber der åbner og lukker en connection hvis de på forhånd ved at der skal indsættes 1000 rækker i en tabel :)
Avatar billede keysersoze Guru
05. august 2010 - 01:24 #12
det var ikke til dig men spørger :)
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
Kategori
Kurser inden for grundlæggende programmering

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