ASP.NET Response.Redirect() 错误

10

以下是我的代码:

try
{
    Session["CuponeNO"] = txtCode.Text;
    txtCode.Text = string.Empty;
    Response.Redirect("~/Membership/UserRegistration.aspx");
}
catch(Exception ex)
{
   string s = ex.ToString();
   lblMessage1.Text = "Error Occured!";
}

即使它在捕获后重定向,我仍然遇到错误。

这是错误信息:

"System.Threading.ThreadAbortException: Thread was being aborted.\r\n at System.Threading.Thread.AbortInternal()\r\n at System.Threading.Thread.Abort(Object stateInfo)\r\n at System.Web.HttpResponse.End()\r\n at System.Web.HttpResponse.Redirect(String url, Boolean endResponse)\r\n at System.Web.HttpResponse.Redirect(String url)\r\n

请问有人能告诉我为什么会出现这个错误吗?

1个回答

19

你可以简单地将......移动。

Response.Redirect("~/Membership/UserRegistration.aspx");

如果您想在Try / Catch块之外处理Response.Redirect(url)引发的ThreadAbortException异常,或者您可以尝试下面John S. Reid的新解决方案

Response.Redirect(url) ThreadAbortException解决方法


作者:John S. Reid
发布日期:2004年3月31日
(于2006年10月28日进行了编辑,以包括更多细节并修复分析中的一些不准确之处,但其核心解决方案仍然相同)

... 向下滚动 ...

当您调用Response.Redirect(url)时,系统会在将重定向发送到响应流后中止当前Web页线程的处理,并抛出ThreadAbortException异常。实际上,Response.Redirect(url)在内部调用了Response.End(),而是Response.End()调用Thread.Abort(),从而将线程结束上推。在极少数情况下,对Response.End()的调用实际上不会调用Thread.Abort(),而是调用HttpApplication.CompleteRequest()。(请参见此Microsoft Support文章中的详细信息和解决方案提示。)

... 向下滚动 ...

PostBack和Render解决方法?重写。

思路是创建一个类级别的变量来标记页面是否应该终止,然后在处理事件或呈现页面之前检查该变量。此标志应在调用HttpApplication.CompleteRequest()之后设置。您可以在每个PostBack事件或呈现块中放置对此值的检查,但这样做很烦琐,容易出错,因此我建议只需覆盖RaisePostBackEvent和Render方法,如下面的代码示例1

private bool m_bIsTerminating = false;

protected void Page_Load(object sender, EventArgs e)
{
    if (WeNeedToRedirect == true)
    {
        Response.Redirect(url, false);
        HttpContext.Current.ApplicationInstance.CompleteRequest();
        m_bIsTerminating = true;

        // Remember to end the method here if there is more code in it.
        return;
    }
}

protected override void RaisePostBackEvent
(
    IPostBackEventHandler sourceControl, 
    string eventArgument
)
{
    if (m_bIsTerminating == false)
    base.RaisePostBackEvent(sourceControl, eventArgument);
}

protected override void Render(HtmlTextWriter writer)
{
    if (m_bIsTerminating == false)
    base.Render(writer);
}

最终分析

最初,我建议您应该将所有调用Response.Redirect(url)的代码替换为Response.Redirect(url, false)和CompleteRequest()调用,但如果您想避免后续处理和HTML渲染,则还需要添加覆盖。经过我最近对代码的深入分析,我发现重定向和结束处理的最有效方法是使用Response.Redirect(url)方法,并让线程在整个堆栈中被中止,但如果此异常像在许多情况下一样给您带来烦恼,则此处的解决方案是下一个最佳选择。

还应注意,Server.Transfer()方法也面临相同的问题,因为它内部调用了Response.End()。好消息是可以通过使用上述解决方案,将对Response.Redirect()的调用替换为Server.Execute()来解决这个问题。


嘿,你的块引用说“*当您调用Response.Redirect(url)时,将抛出ThreadAbortException...*”,你还记得它来自哪里吗?我在通过Google尝试查找该引用的原始来源时遇到了麻烦,因为它实际上已经被多个人剽窃了 :/ - user456814
这是我能找到的最好的链接,但它也不是原作者的作品,它链接并引用了一个名为“John S. Reid”的作者,日期为2004年3月31日:https://derekreynolds.wordpress.com/2009/10/27/using-response-redirect/。然而,原始文章现在似乎已经消失了。 - user456814
3
多亏有“回溯机”(The Way Back Machine),我又找到了原始来源:Response.Redirect(url) ThreadAbortException Solution。请注意,我的翻译不包含解释和其他额外的内容。 - user456814
@Cupcake - 谢谢你找到了那个。我刚刚意识到我最初忘记引用我的引语。我已经更新了我的答案,现在是一个更好的解决方案。所以再次感谢你提供的链接! - Code Maverick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接