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