1

我想知道如何维护 HttpContext ,因为 Web 的请求-响应性质本质上是无状态的。

HttpContext 对象的标识符是否作为 __EVENTTarget / __EVENTARGUMENTS 隐藏字段的一部分发送,以便 HttpRuntime 类可以通过从请求 (HttpWorkerRequest) 中读取此部分来创建 HttpContext 类?我不认为

请让我知道,因为我试图填补我对 http 管道的理解中的一些漏洞,但我找不到任何有关此的信息。

我理解类似 HttpContext.Current.Session["myKey"] = Value;

只是工作,但如果我必须用不同的语言(比如 perl)做类似的事情,我将不得不使用相同的隐藏字段,不是吗?

谢谢-维努

4

2 回答 2

6

为每个请求重新创建 HttpContext。但是,HttpSession 跨请求存储在服务器上。基本上,HttpSession 是一个 Dictionary<string, Dictionary<string, object>>。初始键,即会话 ID,由 cookie 或查询字符串参数(如果使用无 cookie 会话)提供。如果您使用 Fiddler,您将看到 ASP.NET_SessionId cookie,其中包含该用户会话的密钥。

在代码中:

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 会话——但基本思想是相同的。

于 2008-11-07T19:04:52.410 回答
0

我认为您的问题没有一个答案,因为我不认为 HttpContext 保护伞下的所有内容都以相同的方式工作。在您选择的示例中,会话状态,键和值都存储在服务器端。它知道如何将未来的请求连接到该会话状态的方法是使用其中包含(完全不同的)密钥的 cookie。当浏览器发出另一个请求时,它会随请求一起发送此 cookie,服务器使用它来确定要映射到哪个会话。一旦它弄清楚了,你就可以再次访问你的字典,跨越响应。

因此,要在 perl 中执行此操作,您需要手动创建一个 cookie 并在其中存储一个唯一键,将这些唯一键映射到会话状态字典的服务器端,并且几乎可以执行我上面描述的操作。

于 2008-11-07T18:47:08.140 回答