我想知道如何维护HttpContext,因为Web的请求 - 响应性质基本上是无状态的。
是否将HttpContext对象的标识符作为__EVENTTarget / __EVENTARGUMENTS隐藏字段的一部分发送,以便HttpRuntime类可以通过从请求(HttpWorkerRequest)读取此部分来创建HttpContext类?我不认为
请告诉我,因为我正在努力填补我对http管道的理解,但我无法找到有关此信息的任何信息。
我理解类似的东西 HttpContext.Current.Session [“myKey”] =值;
只是工作,但如果我不得不用不同的语言(比如perl)做类似的事情,我必须使用相同的隐藏字段,不是吗?
由于 -Venu
答案 0 :(得分: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会话 - 但基本想法是相同的。
答案 1 :(得分:0)
我认为你的问题没有一个答案,因为我不认为HttpContext保护伞下的所有内容都是一样的。在您选择的示例中,会话状态,密钥和值都存储在服务器端。它知道如何将未来请求连接到该会话状态的方式是使用具有(完全不同的)密钥的cookie。当浏览器发出另一个请求时,它会发送带有请求的cookie,服务器使用它来确定要映射到哪个会话。一旦弄明白,你就可以通过回复再次访问你的字典。
因此,要在perl中执行此操作,您需要手动创建cookie并在其中存储唯一键,将这些唯一键的服务器端映射到会话状态词典,并且几乎按照我的描述进行操作上方。