ASP.NET Response.Redirect()错误

时间:2011-06-02 21:59:02

标签: c# asp.net

这是我的代码:

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

有谁能告诉我为什么会出现这个错误?

1 个答案:

答案 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边界,因此不会滚动。