HTTP е протокол без състояние. Всяка заявка е независима и изпълнението и резултатите ѝ не са пряко свързани с предишната заявка и последвалата, и няма да бъдат пряко засегнати от отговора на предишната заявка, нито ще повлияят пряко на отговора на следващата заявка.
Всъщност нашата система често позволява на потребителите да споделят едни и същи данни (състояние) между браузъра на клиента и сървъра при множество заявки, като например информацията за акаунта за вход на потребителя. Затова ASP.NET предоставя много променливи за управление на състоянието: състояние на приложение, състояние на сесия, състояние на изглед и др.
Обектът HttpContext е само за една HTTP заявка.Свойствата на този клас включват също обекти Request, Response обекти, Session обекти и др. Това е колекцията Items на класа HttpContext, която съдържа обект с хеш таблица под формата на key-value.
Първо, нека разгледаме целта на HttpContext.Current.Items, който работи само при една потребителска заявка (HttpContext.Current.Items, валиден за един HTTPRequest). Когато тази заявка бъде завършена, колекцията от елементи ще бъде загубена, когато информацията от сървъра бъде изпратена обратно към браузъра. Обектът Session е за сесията на потребителя, тоест действа върху множество заявки от потребители, а информацията се губи след изтичането на сесията.
Тъй като HttpContext.Current.Items има толкова кратък жизнен цикъл, при какви обстоятелства може да се използва? Тук е отбелязано, че HttpContext.Current.Items може да се използва при споделяне на данни между HttpModule и HTTPHandler, тъй като всяка потребителска заявка преминава през HTTP runtime pipeline HttpModule, HTTPHandler. Когато имплементирате метода IHttpMoudle за предаване на информация към потребителската заявка чрез HttpMoudle. Можете да използвате HttpContext.Current.Items, за да прехвърляте данни в различни страници за заявки и различни HttpModules, но след като заявката приключи и данните бъдат публикувани, данните в тази колекция ще бъдат изгубени сами. Както е показано на следващата фигура:
Освен това, когато страницата на сървъра скача (Server.Execute/Server.Transfer), можем да използваме HttpContext.Current.Items, за да предаваме данни между двете форми.
Очевидно, ако промените Server.Transfer на Response.Redirect, няма да можете да получите данните в HttpContext.Current.Items на новата страница, защото това е различна Http заявка. System.NullReferenceException: Обектната референция не е зададена на инстанцията на обекта.
|