HTTP — це безстанний протокол. Кожен запит є незалежним, і його виконання та результати не пов'язані безпосередньо з попереднім і наступним запитом, і він не буде безпосередньо впливати на відповідь на попередній запит і не впливає безпосередньо на відповідь на наступний запит.
Насправді наша система часто підтримує користувачам обмін одними й тими ж даними (станом) між клієнтським браузером і сервером за кількома запитами, наприклад, інформацією про обліковий запис користувача. Тому ASP.NET надає багато змінних для керування станом: стан додатку, стан сесії, стан перегляду тощо.
Об'єкт HttpContext призначений лише для одного http-запиту.Властивості цього класу також включають об'єкти запиту, об'єкти відповіді, об'єкти сесії тощо. Це колекція Items класу 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: посилання на об'єкт не встановлене на екземпляр об'єкта.
|