Response.Redirect(URL, false) - 重定向后事件管理 [重复]

Posted

技术标签:

【中文标题】Response.Redirect(URL, false) - 重定向后事件管理 [重复]【英文标题】:Response.Redirect(URL, false) - post-redirect event management [duplicate] 【发布时间】:2013-01-06 09:26:47 【问题描述】:

可能重复:Response.Redirect causes System.Threading.ThreadAbortException

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

更新:刚刚找到一个相关帖子(可能是重复的):Why Response.Redirect causes 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;
  

~~~

[2013 年 1 月 24 日] 回复 https://***.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://***.com/a/12957854/1530187 对我在更新中提到的类似帖子的证实。

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

【问题讨论】:

那段代码和我测试的差不多。诡异的。我使用的是 asp.net 4.5 很好奇。我正在使用 4。也许他们用 4.5 做了一些神奇的事情。我还在 4.0 和 2010 上,所以我认为我无法测试 4.5。 【参考方案1】:

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

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。如果页面回发,则设置为发生此重定向。

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

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

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

【讨论】:

感谢您的回复。你是对的;我忘记在示例代码中包含“Contect.ApplicationInstance.CompleteRequest()”。我已经添加了它。我仍然对如何处理残余事件感到困惑,这些事件在重定向后仍然会触发。用与此类似的检查来包装所有事件是否很常见?从 Page_Load() 重定向只是不好的做法吗?无论如何,再次感谢! 注意:CompleteRequest 始终不会立即完全停止执行。它将继续执行一段时间,直到 ASP.Net 终止线程。最好在之后放置一个无限循环以避免这种情况,然后等到线程被杀死 @ChrisLively 再次感谢您,但我没有看到您描述的行为——请参阅我对上面帖子的更新,其中我添加了与您描述的类似的代码。即使在 .Redirect() 和 .CompleteRequest() 之后,按钮单击事件仍在为我执行。 @jweekes 尝试在最后放置一个无限循环。杀死正在执行的线程并不总是即时的 嗯,我认为无限循环可能比我试图避免的异常更糟糕,但谢谢@Earlz。

以上是关于Response.Redirect(URL, false) - 重定向后事件管理 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Response.Redirect 不会改变 url c#

asp怎样用response.Redirect进行页面跳转。

asp.net response.redirect 命中 url,但不改变浏览器页面

Response.Redirect(url); 会在啥情况下,不跳转页面?

asp怎样用response.Redirect进行页面跳转。

在 ASP.NET 中使用带有友好 URL 的 Response.Redirect