Как поддерживается HttpContext поверх запроса-ответа - PullRequest
1 голос
/ 07 ноября 2008

Мне интересно, как поддерживается HttpContext, учитывая, что веб-природа запроса-ответа по существу не имеет состояния.

Является ли идентификатор для объекта HttpContext, отправляемого как часть скрытых полей __EVENTTarget / __EVENTARGUMENTS, чтобы класс HttpRuntime мог создать класс HttpContext, прочитав этот раздел из запроса (HttpWorkerRequest)? Я не думаю

Пожалуйста, дайте мне знать, поскольку я пытаюсь заполнить некоторые пробелы в моем понимании http-конвейера, и я не смог найти никакой информации об этом.

Я понимаю что-то вроде HttpContext.Current.Session ["myKey"] = Значение;

просто работает, но если бы мне пришлось делать что-то похожее на другом языке (скажем, perl), я бы использовал скрытые поля для того же, не так ли?

Спасибо -Venu

Ответы [ 2 ]

6 голосов
/ 07 ноября 2008

HttpContext воссоздается для каждого запроса. Однако HttpSession хранится на сервере по всем запросам. По сути, HttpSession - это словарь <строка, словарь <строка, объект >>. Начальный ключ, идентификатор сеанса, предоставляется либо параметром 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;
   }
}

Реальная реализация также обрабатывает тайм-ауты сеансов, отмены и сеансы без файлов cookie, но основная идея та же.

0 голосов
/ 07 ноября 2008

Я не думаю, что есть один ответ на ваш вопрос, потому что я не думаю, что все под зонтиком HttpContext работает так же. В выбранном вами примере состояние сеанса, ключ и значение хранятся на стороне сервера. Он знает, как подключить будущие запросы к этому состоянию сеанса, используя cookie, в котором есть (совершенно другой) ключ. Когда браузер делает другой запрос, он отправляет этот cookie вместе с запросом, и сервер использует его, чтобы выяснить, какой сеанс сопоставить. Как только он это выяснит, вы снова получите доступ к своему словарю по ответам.

Итак, чтобы сделать это в Perl, вы бы хотели вручную создать cookie и сохранить в нем уникальный ключ, иметь на стороне сервера сопоставление этих уникальных ключей со словарями состояния сеанса и в значительной степени делать то, что я описал. выше.

...