代码:

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/

10-10 14:27
查看更多