6

可能重复:
Response.Redirect 导致 System.Threading.ThreadAbortException

ASP/C#.NET(Web 表单,不是 MVC)

更新:刚刚找到一个相关的帖子(可能是重复的):为什么 Response.Redirect 会导致 System.Threading.ThreadAbortException?

~ ~ ~

经过一番研究,我了解到,一般来说,在使用 Response.Redirect() 时,最好将第二个参数传递 FALSE,以避免 System.Threading.ThreadAbortException。(http://blogs.msdn.com/b/tmarq/archive/2009/06/25/correct-use-of-system-web-httpresponse-redirect.aspx

我的问题是,“当为第二个参数传递 false 时,是否有推荐的方法(模式)来管理(即跳过)重定向后触发的页面事件中的处理?”

当我在 Page_Load() 中检查和重定向过期会话时,这对我来说主要是一个问题。每次重定向时都必须设置一个“_Redirected”标志,然后在每个事件的顶部检查该标志,这似乎非常乏味。过去我不必担心这一点,因为我总是将 TRUE 传递给第二个参数,不知道更好。

下面是一些代码,显示了我不想做的事情(在处理每个事件之前检查 _Redirected)。也许我正在寻找的是更好的会话过期处理模式。

任何有关如何改进此处理的建议将不胜感激。

private bool _Redirected = false;    

protected void Page_Load(object sender, EventArgs e)
{
  if (Session["key"] == null)
  {
    Response.Redirect("SessionExpired.aspx", false);
    Context.ApplicationInstance.CompleteRequest();

    _Redirected = true;
  }       
}

protected void Page_PreRender(object sender, EventArgs e)
{
  if (!_Redirected)
  {
    // do Page_PreRender() stuff...
  }
}

protected void Button1_Click(object sender, EventArgs e)
{
  if (!_Redirected)
  {
    // do Button1_Click() stuff...

    Response.Redirect("Button1Page.aspx", false);
    Context.ApplicationInstance.CompleteRequest();

    _Redirected = true;
  }
}

protected void Button2_Click(object sender, EventArgs e)
{
  if (!_Redirected)
  {
    // do Button2_Click() stuff...

    Response.Redirect("Button2Page.aspx", false);
    Context.ApplicationInstance.CompleteRequest();

    _Redirected = true;
  }
}

~ ~ ~

[01/24/2013] 响应https://stackoverflow.com/users/2424/chris-lively(谢谢,顺便说一句),这里是简化的代码,我相信它与您测试的类似。我仍然看到 Button1_Click() 在 Response.Redirect(url, false) 和 Page_Load() 中的 .CompleteRequest() 之后在回发时执行。

protected void Page_Load(object sender, EventArgs e)
{
  if (this.IsPostBack)
  {
    Response.Redirect("Redirect.aspx", false);
    Context.ApplicationInstance.CompleteRequest();
  }
}

protected void Button1_Click(object sender, EventArgs e)
{
  Response.Write("Button1 clicked!");
}

对我在更新中提到的类似帖子的此响应https://stackoverflow.com/a/12957854/1530187证实了这种行为。

知道我做错了什么会导致页面在重定向后继续执行吗?

4

1 回答 1

7

您引用了一篇相当不错的文章,但您的代码并未反映作者建议的“正确”执行此操作的方法。即:

protected void Page_Load(object sender, EventArgs e)
{
  if (Session["key"] == null)
  {
    Response.Redirect("SessionExpired.aspx", false);
    Context.ApplicationInstance.CompleteRequest();
  }       
}

更新
我整理了一个非常简单的示例应用程序。它只有两个表单页。
第一页上有一个按钮,它做了一个 response.write。我在这条线上放了一个断点。在 page_load 方法中,我放置了一个重定向,然后立即调用CompleteRequest. 如果页面回发,则设置为发生此重定向。

第二页所做的只是发出“你好”

然后我运行了应用程序,它调出了第一个表单。我点击了按钮。断点从未被击中,它被重定向。这正是我所期望的。即 page_load 方法捕获回发,执行重定向并立即完成请求,无需进一步处理页面。

这意味着绝对没有理由将if (!_Redirected)代码放在每次按钮单击中。您需要做的就是复制/粘贴我在此答案顶部的代码。它将阻止调用这些点击。

于 2013-01-23T00:45:39.807 回答