关于C#:response.redirect不保留httpContext.current.items

Response.redirect does not preserve HttpContext.Current.Items

我在学习江户记1〔0〕时发现

HttpContext object will be constructed newly for every request given
to an ASP.Net application

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

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

查询

当我使用server.transfer时,此密钥保持不变,而在使用response.redirect时不是这样。

混乱

wnever未生成新请求,已创建httpcopntext对象。此外,会话被保留。它是httpContext的一部分。

1
HttpContext.Current.Session

如果会话可以持续,为什么Response.Redirect中的HttpContext.Current.Items不能继续?


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

会话在请求之间持续(通常使用sessionid cookie将用户与服务器上的值绑定),因此仍然可用。


我建议您使用DotPeek查看System.Web.dll,特别是getter HttpContext.Items["AspSession"]中使用的属性HttpContext.Session,以及调用SessionStateUtility.AddHttpSessionStateToContext(...)的方法SessionStateModule.InitStateStoreItem(...)(在getter中调用)。您可以看到,httpsessionstate集合的内容存储在SessionStateStoreProviderBase实现的(inproc,sql)对象中的请求之间,一个字的深度更高。而HttpContext.Itemshashtable则是先初始化get,然后在请求之间消亡。