HTTP je bezstavový protokol. Každý požadavek je nezávislý a jeho provedení a výsledky nejsou přímo spojeny s předchozím a následujícím požadavkem, a nebude přímo ovlivněn odpovědí na předchozí požadavek, ani přímo neovlivní odpověď na následující požadavek.
Ve skutečnosti náš systém často umožňuje uživatelům sdílet stejná data (stav) mezi klientským prohlížečem a serverem při více požadavcích, například o přihlašovacím účtu uživatele. Proto ASP.NET poskytuje mnoho proměnných pro správu stavu: stav aplikace, stav relace, stav zobrazení atd.
Objekt HttpContext je určen pouze pro jeden HTTP požadavek.Vlastnosti této třídy zahrnují také objekty Request, objekty Response, objekty relace atd. Jedná se o kolekci Items třídy HttpContext, která obsahuje objekt hashovací tabulky ve formě klíč-hodnota.
Nejprve se podívejme na účel HttpContext.Current.Items, který funguje pouze na jeden uživatelský požadavek (HttpContext.Current.Items platí pro jeden HTTPRequest). Po dokončení tohoto požadavku se kolekce položek ztratí, když jsou informace o serveru odeslány zpět do prohlížeče. Objekt Session je pro uživatelovu relaci, tedy jedná na více uživatelských požadavků a informace se po vypršení relace ztratí.
Protože HttpContext.Current.Items má tak krátký životní cyklus, za jakých okolností jej lze použít? Je zde uvedeno, že HttpContext.Current.Items lze použít při sdílení dat mezi HttpModule a HTTPHandler, protože každý uživatelský požadavek prochází HTTP runtime pipeline HttpModule, HTTPHandler. Když implementujete metodu IHttpMoudle pro předání informací uživateli, požádáte o HttpMoudle. Můžete použít HttpContext.Current.Items k přenosu dat na různých stránkách požadavků a různých HttpModulech, ale jakmile požadavek skončí a data jsou odeslána, data v této kolekci se sama ztratí. Jak je znázorněno na následujícím obrázku:
Navíc, když stránka serveru skočí (Server.Execute/Server.Transfer), můžeme použít HttpContext.Current.Items k předávání dat mezi dvěma formuláři.
Samozřejmě, pokud změníte Server.Transfer na Response.Redirect, nebudete moci získat data v HttpContext.Current.Items na nové stránce, protože jde o jiný HTTP požadavek. System.NullReferenceException: Reference objektu není nastavena na instanci objektu.
|