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) - 重定向后事件管理 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
asp怎样用response.Redirect进行页面跳转。
asp.net response.redirect 命中 url,但不改变浏览器页面
Response.Redirect(url); 会在啥情况下,不跳转页面?