代码:
Session["foo"] = "bar";
Response.Redirect("foo.aspx");
问题:
当foo.aspx从 session 中读取“foo”时,它不存在。 session 在那里,但是“foo”没有任何值(value)。
我已经在我们的生产环境中间歇地观察到了这一点。但我的意思不是在这里问a question about Response.Redirect()。
说明:
Bertrand Le Roy解释(粗体字是我的):
我的要点是,Response.Redirect()可以在结尾线程中使用繁重的代码。如果这些 session 写得太过用力,那可能会威胁到我的 session 写。
问题:
那么ASP.NET session 管理如何使它容易受到此攻击呢?直到 session 写入行“完成”后,Response.Redirect()代码行才开始执行-怎么会对我的 session 写入造成这样的威胁?
在下一行代码执行之前, session 写入未“完成”怎么办?还有其他情况下 session 写入类似(好像从未发生过)丢失的情况吗?
最佳答案
我对 session 编写的内部知识还不太熟悉,但是我认为它具有一些复杂性,因为它依赖于将浏览器 session cookie转换为服务器标识。另外,我不确定在运行时是否可以在此处播放ThreadAbortExceptions do have special considerations。
在任何情况下,Response.Redirect()
都有一个带有 bool 参数的重载,该参数使您可以指定是否要结束线程。
Response.Redirect(string url, bool endResponse);
如果将endResponse设置为“false”来调用它,它将正常完成,而不是在内部调用
Thread.Abort()
。但是,这意味着它还将在完成之前执行页面生命周期中剩余的所有代码。一个不错的折衷方法是先调用
Response.Redirect(url, false)
,再调用Application.CompleteRequest()
。这将允许您进行重定向,但也可以通过最少的其他生命周期处理来正常关闭当前执行上下文。关于asp.net - 为什么/何时 session 写入易受线程终止的影响?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2267818/