1

我正在学习HttpContext并发现

将为给 ASP.Net 应用程序的每个请求重新构造 HttpContext 对象

现在,考虑一个案例,当我有两页时。WebForm1 和 Webform2。在 Form1 中,我正在编写下面提到的代码并重定向到 form2。

HttpContext.Current.Items.Add("Key", "Value");

询问

当我使用 Server.Transfer 时,此密钥保持不变,而使用 Response.Redirect 时并非如此

困惑

每当生成新请求时,都会创建 HttpCopntext 对象。此外,会话被保留。这是 HttpContext 的一部分。

HttpContext.Current.Session

如果 Session 可以持续,为什么不能HttpContext.Current.Itemsin Response.Redirect

4

2 回答 2

4

重定向会生成一个新的HttpContext,这就是其中的项目丢失的原因 - 重定向有效地告诉浏览器要请求的下一个 URL,并且当它这样做时,它会丢失触发重定向的上一个请求的上下文。

会话在请求之间持续存在(通常使用 sessionID cookie 将用户与服务器上的值联系起来),因此仍然可用。

于 2013-05-22T17:03:04.297 回答
1

我建议您查看dotPeek at System.Web.dll,特别是HttpContext.Session在 getter 中使用的属性HttpContext.Items["AspSession"]和 at 调用的方法SessionStateModule.InitStateStoreItem(...)(在该 getter 中调用)SessionStateUtility.AddHttpSessionStateToContext(...)。可以看到,HttpSessionState 集合的内容存储在请求之间的SessionStateStoreProviderBase实现(InProcSql)对象中,一句话更深。而HttpContext.Items哈希表在第一次获取时被初始化并在请求之间消失。

于 2013-05-22T21:07:33.150 回答