Как поддерживается HttpContext поверх запроса-ответа
-
07-07-2019 - |
Вопрос
Мне интересно, как поддерживается HttpContext, учитывая, что характер запроса-ответа в Интернете по существу не имеет состояния.
Является ли идентификатор для объекта HttpContext отправляемым как часть скрытых полей __EventTarget / __EVENTARGUMENTS, чтобы класс HttpRuntime мог создать класс HttpContext, прочитав этот раздел из запроса (HttpWorkerRequest)?Я не думаю, что
Пожалуйста, дайте мне знать, поскольку я пытаюсь заполнить некоторые пробелы в моем понимании http-конвейера, и я не смог найти никакой информации об этом.
Я понимаю что-то вроде HttpContext.Current.Сессия ["MyKey"] = значение;
просто работает, но если бы мне пришлось сделать что-то подобное на другом языке (скажем, perl), мне пришлось бы использовать скрытые поля для того же самого, не так ли?
Спасибо -Venu
Решение
HttpContext создается заново для каждого запроса.Однако HttpSession сохраняется на сервере во всех запросах.По сути, HttpSession - это Словарь<string, Dictionary<string,="" object="">>.Начальный ключ, идентификатор сеанса, предоставляется либо файлом cookie, либо параметром строки запроса (если используются сеансы без файлов cookie).Если вы используете Fiddler, вы увидите файл cookie ASP.NET_SessionId, который содержит ключ для сеанса этого пользователя.
В коде:
class HttpSessionState {
private static readonly Sessions =
new Dictionary<string, Dictionary<string, object>>();
public object this(string key) {
get {
return GetCurrentUserSession()[key]
}
set {
GetCurrentUserSession()[key] = value;
}
}
private Dictionary<string, object> GetCurrentUserSession() {
var id = GetCurrentUserSessionId[]
var d = Sessions[id];
if (d == null) {
d = new Dictionary<string, object>();
Sessions[id] = d;
}
return d;
}
private string GetCurrentUserSessionId() {
return HttpContext.Current.Request.Cookies["ASP.NET_SessionId"].Value;
}
}
Реальная реализация также обрабатывает тайм-ауты сеансов, отказы от них и сеансы без приготовления - но основная идея та же.
Другие советы
Я не думаю, что есть один ответ на ваш вопрос, потому что я не думаю, что все под эгидой HttpContext работает одинаково.В выбранном вами примере состояния сеанса как ключ, так и значение хранятся на стороне сервера.Способ, которым он знает, как подключать будущие запросы к этому состоянию сеанса, заключается в использовании файла cookie, в котором содержится (совершенно другой) ключ.Когда браузер делает другой запрос, он отправляет этот файл cookie вместе с запросом, и сервер использует его, чтобы определить, к какому сеансу привязать.Как только он поймет это, вы снова получите доступ к своему словарю во всех ответах.
Итак, чтобы сделать это на perl, вам нужно вручную создать файл cookie и сохранить в нем уникальный ключ, сопоставить эти уникальные ключи на стороне сервера со словарями состояния сеанса и в значительной степени выполнить то, что я описал выше.