webForumDet fria alternativet

Frågor om Cookies

.NET

5 svar · 584 visningar · startad av CokeLight

Medlem sedan juni 2000504 inlägg
Frågan#1

1. Om man kör intranät o vet att folk kan köra cookies, så finns väl ingen fördel med att använda sessions istället för cookies? Tidigare fick jag för mig att sessions tog mer processorkraft på servern o att cookies var bättre för att den "belastade" klienten mer..? Men varje gång man kör Request/Response.Cookies så sker ju anrop till servern också..? Alltså, blir det inte lika mycket trafik pga det som med sessions..?

Om jag har säg 20 variabler med användardata som jag använder vid printning, mail, uppdatering, radering innan de t.ex. skrivs till databas osv, vilket är mest naturligt att använda då.. Querystrings, Cookies, eller Sessions?

2. om jag skapar en cookie en gång på vilken sida som helst med

Response.Cookies["name"].Value = "something"; (+ expire)

så stämmer det väl att så fort klienten accessar sidan där den koden finns så sparas den cookien på klienten?

3. LÄSER jag sedan värdet från cookie med Request eller Response? typ

var = Request.Cookies["name"].Value;
//eller..
var = Response.Cookies["name"].Value;

4. Om jag skriver

Response.Cookies["name"].Value = var;

så uppdateras automatiskt värdet på klienten också..? vad händer om man skriver

Request.Cookies["name"].Value = var;

5. När man kollar om cookie värdet är tomt är det bäst att kolla om Request.Cookies är tomt va..?

Orsaken till att jag frågar är att det är nån jäkla bug i mitt program.. nånstans tappar användaren ibland värdet o jag vet inte vad det beror på.. om det är session/cookie som är blank... eller om det är nån control som tappas bort i nån IF/ELSE.. så jag tänkte börja med att renodla o bara köra antingen cookie eller session, men då vill jag vara säker på att jag fattar cookies ordentligt först.. :)

Medlem sedan juni 2000504 inlägg
#2

Vad gäller det här med 20 variabler så tänkte jag att jag kör allt sånt i ViewState (hade glömt bort det).. o sen allt som har med inloggning/användare i cookies..

Medlem sedan dec. 19996 721 inlägg
#3

CokeLight skrev:

1. Om man kör intranät o vet att folk kan köra cookies, så finns väl ingen fördel med att använda sessions istället för cookies?

Även sessions bygger på att folk kan köra cookies (det går att köra utan, men det är knepigt och inte påslaget som default). Och det finns massor av fördelar med sessions (mindre trafik, kan lagra det mesta du kastar in i det etc.). Cookies lirar inte i samma division ens.. :)

CokeLight skrev:

Tidigare fick jag för mig att sessions tog mer processorkraft på servern o att cookies var bättre för att den "belastade" klienten mer..?

Belastningen består i att klienten måste skicka och ta emot mer information, vid varje request, men det blir ju en belastning för servern också. Men visst, sessions tar mer processorkraft på servern och ska användas med förnuftighet.

CokeLight skrev:

Men varje gång man kör Request/Response.Cookies så sker ju anrop till servern också..?

Det blir aldrig mer än en request och en tillhörande respons, oavsett vad man hittar på. Klienten skickar alla sina kakor (som tillhör webbplatsen i fråga) vid varje request (även när den "requestar" bilder, stylesheets etc.), och servern skickar tillbaka alla som har uppdaterats eller skapats.

CokeLight skrev:

Alltså, blir det inte lika mycket trafik pga det som med sessions..?

...det blir alltså mer trafik med cookies

CokeLight skrev:

Om jag har säg 20 variabler med användardata som jag använder vid printning, mail, uppdatering, radering innan de t.ex. skrivs till databas osv, vilket är mest naturligt att använda då.. Querystrings, Cookies, eller Sessions?

Utan tvekan Sessions. Det är det de är till för, och de gör det bra, eftersom de hindrar klienten från att mixtra med informationen. En sådan sak som UserID osv. ska man aldrig lagra i en cookie, eftersom det är busenkelt att ändra på värdet, från "utsidan".

CokeLight skrev:

2. om jag skapar en cookie en gång på vilken sida som helst med

Response.Cookies["name"].Value = "something"; (+ expire)

så stämmer det väl att så fort klienten accessar sidan där den koden finns så sparas den cookien på klienten?

Ja, det skulle man kunna säga. I praktiken säger man till servern att "när du skickar tillbaka webbsidan till klienten vill jag att du inkluderar den här cookien i svaret, så att klienten kan komma ihåg den"

CokeLight skrev:

3. LÄSER jag sedan värdet från cookie med Request eller Response? typ

var = Request.Cookies["name"].Value;
//eller..
var = Response.Cookies["name"].Value;

Du läser av värdet med Request.Cookies. Response.Cookies ska ses som en beställningslista på nya/uppdaterade cookies.

CokeLight skrev:

4. Om jag skriver

Response.Cookies["name"].Value = var;

så uppdateras automatiskt värdet på klienten också..? vad händer om man skriver

Request.Cookies["name"].Value = var;

Ingenting av värde.

CokeLight skrev:

5. När man kollar om cookie värdet är tomt är det bäst att kolla om Request.Cookies är tomt va..?

Ja, det är MYCKET viktigt. Om du skriver...

if (Response.Cookies["name"].Value==null)
{
    DoSomeThing();
}

...så kommer du aldrig att komma till "DoSomeThing". Det är nämligen så att det skapas en cookie, bara genom att du letar efter den. Ännu värre är dock att man även skriver över cookien i Request.Cookies, om den skulle råka finnas!

CokeLight skrev:

Orsaken till att jag frågar är att det är nån jäkla bug i mitt program.. nånstans tappar användaren ibland värdet o jag vet inte vad det beror på.. om det är session/cookie som är blank... eller om det är nån control som tappas bort i nån IF/ELSE.. så jag tänkte börja med att renodla o bara köra antingen cookie eller session, men då vill jag vara säker på att jag fattar cookies ordentligt först.. :)

Problemen kanske förklaras av det jag skrev ovan? I vilket fall som helst rekommenderar jag att du kör med sessions. Dock finns det en hel del att tänka på med dessa också, men de är i alla fall inte lika lurigt uppbyggda.

Cookie-hanteringen i ASP.NET är en stor miss från MS. Cookies från Request och Response har inget relevant förhållande, så det hade varit bättre om det hade funnit en HttpResponseCookie- och en HttpRequestCookie-klass, i stället för HttpCookie.

Till sist ett litet session-tips, som inte så många tänker på.

Sätt EnableSessionState i web.config till "ReadOnly", och slå om den till "True" endast på de sidor som skriver till sessionen (inloggningssidor o.dyl). Annars kommer servern att behöva läsa in sessionen vid början av varje request, för att sedan skriva tillbaka den vid slutet. Med readonly läses sessionen bara in, vilket sparar serverresurser.

Medlem sedan dec. 19996 721 inlägg
#4

CokeLight skrev:

Vad gäller det här med 20 variabler så tänkte jag att jag kör allt sånt i ViewState (hade glömt bort det).. o sen allt som har med inloggning/användare i cookies..

ViewState är till för lagring inom en enda sida, inte för variabler som ska finnas tillgängliga lite här och där. Och cookies, ja..det har vi rett ut :)

Medlem sedan juni 2000504 inlägg
#5

Först, tack så mycket för jättebra svar.. !! :) tur att jag fick svar om detta innan jag började göra massa (dumma) förändringar..

...det blir alltså mer trafik med cookies

aha.. tidigare hade jag bara en vag uppfattning om att Cookies betydde att webbsidan bara jobbade mot Cookies som låg på klientdatorn, o att det var minimal inblandning av servern.. typ att klienten på så sätt avlastade servern, att de delade på jobbet ungefär.. men okay.. bra att jag lärde mig det.. :) hade heller ingen aning om att Sessions också krävde att Cookies var påslaget på klienten..

Det blir aldrig mer än en request och en tillhörande respons, oavsett vad man hittar på. Klienten skickar alla sina kakor (som tillhör webbplatsen i fråga) vid varje request (även när den "requestar" bilder, stylesheets etc.), och servern skickar tillbaka alla som har uppdaterats eller skapats.

Så m.a.o., Request.Cookies innehåller alla Cookies som nånsin skapats o Response.Cookies bara de förändrade alltså..? okay..

Det här är ju lite intressant också:

En sådan sak som UserID osv. ska man aldrig lagra i en cookie, eftersom det är busenkelt att ändra på värdet, från "utsidan".

Men om jag använder FormsAuthentication så använder den ju Cookies.. ska jag så fort man loggat in lagra användarID/namn i Sessions under resten av programförloppet då, hellre än att spara det i Cookie?

private bool isValidLogin(string sUserName, string sPassword)
{
	SqlCommand command = this.dbConn.GetCommand("coke_Login", "@UserName", sUserName);
	SqlDataReader sdr;
	bool isValid = false;

	sdr = command.ExecuteReader();

	while(sdr.Read())
	{
		if(sdr["UserPassword"].ToString().ToLower() == sPassword.ToLower())
		{
			//Session["FullName"] = sdr["FullName"].ToString();

			Response.Cookies["FullName"].Value = sdr["FullName"].ToString();
			//Response.Cookies["FullName"].Expires = ticket.Expiration;
			Response.Cookies["FullName"].Expires = DateTime.Now.AddYears(30);

			isValid = true;
		}
	}

	sdr.Close();
	return isValid;
}

(på tal om inloggning.. ovanstående kod är förresten lite långsam.. tar några sekunder att exekvera.. går det snabbare om man lagrar namn i web.config istället för att loopa igenom stored proc, eller hur är det med Windows Authentication?)

aha.. ViewState fungerar bara inom sidan.. oki.. men de är ju hiddenfält väl..? trodde man kunde accessa dem fritt ung. som med Sessions.. orsaken att jag ville ha ViewState istället för Sessions var att jag, ungefär som med Cookies, inbillade mig att de belastade servern mindre o lät klienten jobba mer.. men felanvänt kan det säkert samtidigt bli värre.. om man är orolig för prestanda kanske det är knep såsom EnableSessionState, cachning o liknande man ska titta på istället.. :)

tack för tipsen om EnableSessionState.. sitter o läser om det just nu..

Medlem sedan juni 2000504 inlägg
#6

snabb fråga.. kan man tillämpa EnableSessionState på User Controls eller funkar det bara för aspx sidor..? De har ju inte Page directive.. de börjar ju t.ex. med

<%@ Control Language="c#" AutoEventWireup="false"

istället för

<%@ Page language="c#" Codebehind="default.aspx.cs"

.. om jag lägger in EnableSessionState="True" i Control directive så blir sidan bara blank..

272 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
132 ms — deklarationer (db)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)
131 ms — ändringar (db)