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不能继续?
- 请参阅stackoverflow.com/questions/5096544/…
重定向会生成一个新的HttpContext,这就是它中的项目丢失的原因——重定向会有效地告诉浏览器下一个请求的URL,当它丢失了触发重定向的上一个请求的上下文时。
会话在请求之间持续(通常使用sessionid cookie将用户与服务器上的值绑定),因此仍然可用。
- HttpContext.Current.Session坚持,HttpContext.Cuttent.Items不坚持。为什么?
- 因为第一个是设计在请求之间保持,第二个不是。
- 我的意思是,哪些东西装着Session,而不装东西?
我建议您使用DotPeek查看System.Web.dll,特别是getter HttpContext.Items["AspSession"]中使用的属性HttpContext.Session,以及调用SessionStateUtility.AddHttpSessionStateToContext(...)的方法SessionStateModule.InitStateStoreItem(...)(在getter中调用)。您可以看到,httpsessionstate集合的内容存储在SessionStateStoreProviderBase实现的(inproc,sql)对象中的请求之间,一个字的深度更高。而HttpContext.Itemshashtable则是先初始化get,然后在请求之间消亡。