繁体   English   中英

ASP.NET Response.Redirect() 错误

[英]ASP.NET Response.Redirect( ) Error

这是我的代码:

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: 线程被中止。\r\n 在 System.Threading.Thread.AbortInternal()\r\n 在 System.Threading.Thread.Abort(Object stateInfo)\r\n 在 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

谁能告诉我为什么会发生这个错误?

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

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

...在 Try / Catch 块之外,或者您可以尝试以下John S. Reid 的更新解决方案

Response.Redirect(url) ThreadAbortException 解决方案


约翰·S·里德
2004 年 3 月 31 日
(2006 年 10 月 28 日编辑,在我的分析中包含更多细节并修复了一些不准确之处,尽管其核心解决方案保持不变)

……跳下去……

调用 Response.Redirect(url) 时会引发 ThreadAbortException,因为系统在将重定向发送到响应 stream 后会中止当前 web 页面线程的处理。 Response.Redirect(url) 实际上在内部调用了 Response.End() ,而 Response.End() 调用了 Thread.Abort() ,它使堆栈冒泡以结束线程。 在极少数情况下,对 Response.End() 的调用实际上不会调用 Thread.Abort(),而是调用 HttpApplication.CompleteRequest()。 (有关详细信息和解决方案的提示,请参阅此Microsoft 支持文章。)

……跳下去……

回发和渲染解决方案? 覆盖。

这个想法是创建一个 class 级别的变量来标记页面是否应该终止,然后在处理您的事件或呈现您的页面之前检查该变量。 此标志应在调用 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() 以相同的方式解决。

1 - 我修改了代码格式以使其适合 SO 边界内,因此它不会滚动。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM