HTTP je bezstavový protokol. Každá požiadavka je nezávislá a jej vykonanie a výsledky nie sú priamo spojené s predchádzajúcou a nasledujúcou požiadavkou, a nebude priamo ovplyvnená odpoveďou na predchádzajúcu žiadosť, ani priamo neovplyvní odpoveď na nasledujúcu žiadosť.
V skutočnosti náš systém často umožňuje používateľom zdieľať rovnaké údaje (stav) medzi klientským prehliadačom a serverom pri viacerých požiadavkách, napríklad o prihlasovacích údajoch používateľa. Preto ASP.NET poskytuje mnoho premen na správu stavu: stav aplikácie, stav relácie, stav zobrazenia a podobne.
Objekt HttpContext je určený len pre jednu http požiadavku.Vlastnosti tejto triedy zahŕňajú aj objekty Request, Response, Session objekty a podobne. Toto je kolekcia Items triedy HttpContext, ktorá obsahuje objekt hashovacej tabuľky vo forme kľúč-hodnota.
Najprv sa pozrime na účel HttpContext.Current.Items, ktorý funguje len na jednu požiadavku používateľa (HttpContext.Current.Items platí pre jeden HTTPRequest). Po dokončení tejto požiadavky sa kolekcia položiek stratí, keď sa informácie o serveri vrátia späť do prehliadača. Objekt Session je určený pre reláciu používateľa, teda reaguje na viaceré požiadavky používateľa a informácie sa strácajú po uplynutí relácie.
Keďže HttpContext.Current.Items má tak krátky životný cyklus, za akých okolností ho možno použiť? Je tu uvedené, že HttpContext.Current.Items je možné použiť pri zdieľaní dát medzi HttpModule a HTTPHandler, pretože každá používateľská požiadavka prechádza cez HTTP runtime pipeline HttpModule, HTTPHandler. Keď implementujete metódu IHttpMoudle na odovzdanie informácií používateľovi, požiadajte o to cez HttpMoudle. Môžete použiť HttpContext.Current.Items na prenos dát v rôznych stránkach požiadaviek a rôznych HttpModules, ale keď požiadavka skončí a dáta sú zverejnené, údaje v tejto kolekcii sa samy stratia. Ako je znázornené na nasledujúcom obrázku:
Okrem toho, keď stránka servera skočí (Server.Execute/Server.Transfer), môžeme použiť HttpContext.Current.Items na prenos dát medzi dvoma formulármi.
Samozrejme, ak zmeníte Server.Transfer na Response.Redirect, nebudete môcť získať dáta v HttpContext.Current.Items na novej stránke, pretože ide o iný HTTP požiadavok. System.NullReferenceException: Referencia objektu nie je nastavená na inštanciu objektu.
|