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

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

请告诉我,因为我正在努力填补我对http管道的理解,但我无法找到有关此信息的任何信息。

我理解类似的东西 HttpContext.Current.Session [<!> quot; myKey <!> quot;] = Value;

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

由于 -Venu

有帮助吗?

解决方案

为每个请求重新创建HttpContext。但是,HttpSession跨请求存储在服务器上。基本上,HttpSession是Dictionary <!> lt; string,Dictionary <!> lt; string,object <!> gt; <!> gt;。初始密钥(会话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会话 - 但基本想法是相同的。

其他提示

我认为你的问题没有一个答案,因为我认为HttpContext保护伞下的所有内容都不会以同样的方式运作。在您选择的示例中,会话状态,密钥和值都存储在服务器端。它知道如何将未来请求连接到该会话状态的方式是使用具有(完全不同的)密钥的cookie。当浏览器发出另一个请求时,它会发送带有请求的cookie,服务器使用它来确定要映射到哪个会话。一旦弄明白,你就可以通过回复再次访问你的字典。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top