这是我的代码:
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!";
}
我收到错误,即使它在catch之后重定向。
这是错误:
“System.Threading.ThreadAbortException: 线程正在中止。\ r \ n at System.Threading.Thread.AbortInternal(个)\ r \ n 在 System.Threading.Thread.Abort(对象 stateInfo)\ r \ n at System.Web.HttpResponse.End()\ r \ n at System.Web.HttpResponse.Redirect(字符串 url,Boolean endResponse)\ r \ n at System.Web.HttpResponse.Redirect(字符串 URL)\ r \ n
有谁能告诉我为什么会出现这个错误?
答案 0 :(得分:19)
你可以简单地移动......
Response.Redirect("~/Membership/UserRegistration.aspx");
...在Try / Catch块之外,您可以尝试下面的John S. Reid's newer solution:
Response.Redirect(url) ThreadAbortException Solution
作者:John S. Reid,2004年3月31日
(2006年10月28日编辑,包括更多细节,并修复了我的分析中的一些不准确之处,尽管解决方案的核心保持不变)
...跳过......
调用Response.Redirect(url)时抛出ThreadAbortException,因为系统在将重定向发送到响应流后中止当前网页线程的处理。 Response.Redirect(url)实际上是在内部调用Response.End(),而它的Response.End()调用Thread.Abort(),它会使堆栈冒泡以结束线程。在极少数情况下,对Response.End()的调用实际上不会调用Thread.Abort(),而是调用HttpApplication.CompleteRequest()。 (有关详细信息和解决方案的提示,请参阅此Microsoft Support article。)
...跳过......
PostBack和渲染解决方案?覆盖。强>
我们的想法是创建一个类级变量,用于标记Page是否应终止,然后在处理事件或呈现页面之前检查变量。应在调用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,false)和CompleteRequest()调用替换所有对Response.Redirect(url)的调用,但是如果你想避免回发处理和html渲染你还需要添加覆盖。从我最近对代码的深入分析中我可以看到,重定向和结束处理的最有效方法是使用Response.Redirect(url)方法并让线程在堆栈中一直中止,但是如果这个异常正如在许多情况下那样让你感到悲伤,那么这里的解决方案是下一个最好的事情。
还应该注意,Server.Transfer()方法遇到了同样的问题,因为它在内部调用了Response.End()。好消息是,可以通过上述解决方案以相同的方式解决它,并用Server.Execute()替换对Response.Redirect()的调用。
1 - 我修改了代码格式以使其适合SO边界,因此不会滚动。