可能重复:
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证实了这种行为。
知道我做错了什么会导致页面在重定向后继续执行吗?