Как поддерживается HttpContext поверх запроса-ответа

StackOverflow https://stackoverflow.com/questions/273126

  •  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 и сохранить в нем уникальный ключ, сопоставить эти уникальные ключи на стороне сервера со словарями состояния сеанса и в значительной степени выполнить то, что я описал выше.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top