为每个请求重新创建 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 会话——但基本思想是相同的。