可能重复:
Response.Redirect causes System.Threading.ThreadAbortException
ASP / C#.NET(网络表单,而不是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()中检查并重定向过期的会话时,这对我来说主要是一个问题。每次重定向然后在每个事件的顶部检查该标志时,可能必须设置“_Rreirected”标志似乎非常繁琐。我过去不必担心这个问题,因为我总是为第二个参数传递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时(谢谢你,顺便说一下),这里是简化的代码,我认为这与你测试的类似。在Page_Load()中使用.CompleteRequest()的Response.Redirect(url,false)之后,我仍然看到Button1_Click()在post post上执行。
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对我在上次更新中提到的类似帖子中证实了此行为。
知道我做错了会导致页面在重定向后继续执行吗?
答案 0 :(得分:6)
您引用了一篇相当不错的文章,但您的代码并没有反映作者建议的“正确”执行此操作的方式。即:
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)
代码。您需要做的就是复制/粘贴我在此答案顶部的代码。它会阻止调用这些点击。