【问题标题】:Getting Thread Abort Exception while using Response.Redirect()使用 Response.Redirect() 时获取线程中止异常
【发布时间】:2013-08-27 12:23:28
【问题描述】:

我在更新面板下的页面中编写了以下代码。

protected void myGrid_RowCommand(object sender, GridViewCommandEventArgs e)
{
    try
    {
        if (e.CommandName =="EditNames")
        {
            long lSelectedName = Convert.ToInt64(e.CommandArgument);
            Session["SelectedItem"] = lSelectedName;
            Response.Redirect("EditItem.aspx");
        }
        else if (e.CommandName =="DeleteNames")
        {
            long lSelectedName = Convert.ToInt64(e.CommandArgument);
            ValidName.DeleteItem(lSelectedName);

            ScriptManager.RegisterStartupScript(this, GetType(), "Key", "alert('Name deleted sucessfully')", true);
        }
    }
    catch (System.Threading.ThreadAbortException)
    {

    }
    catch (Exception ex)
    {
        Error handling code...
    }
}

在这里,我在重定向时遇到线程中止异常。但是,我通过使用错误处理程序 System.Threading.ThreadAbortException 解决了它。

但我不确定为什么在重定向时会出现该错误。即使我解决了这个问题,我也想知道我的编码方式是否有任何错误,或者有什么方法可以完全阻止错误触发。

提供您的意见...

请注意,该页面位于 AJAX UPDATE PANEL 下。

【问题讨论】:

标签: c# asp.net .net


【解决方案1】:

请阅读这篇文章 - http://blogs.msdn.com/b/tmarq/archive/2009/06/25/correct-use-of-system-web-httpresponse-redirect.aspx

最好通过调用Context.ApplicationInstance.CompleteRequest()绕过请求执行管道,而不是结束请求。

所以你的代码看起来像这样:

Response.Redirect("TargetPage", false);        //write redirect
Context.ApplicationInstance.CompleteRequest(); // end response

【讨论】:

  • Context.ApplicationInstance.CompleteRequest();
  • 这是更好的答案,因为它首先避免了异常。我希望我在几年前就知道这一点!
  • 确保 Context 是大写的,尽管它是 Page.Context 对象,@Aheho 所做的编辑虽然是善意的,但并不正确。
【解决方案2】:

尽管我解决了这个问题,但我想知道我的编码方式是否有任何错误

没有错,你做得很好。

预计会出现此错误。它被抛出是因为服务器线程在重定向时实际上被中止了。来自MSDN documentation

如果为 endResponse 参数指定 true,则此方法会为原始请求调用 End 方法,该方法在完成时会引发 ThreadAbortException 异常。

以及overload you're using: 的文档

Redirect 调用 End 在完成时抛出 ThreadAbortException 异常。

【讨论】:

  • 所以,使用 Response.redirect("Edititem.aspx",false) 避免了线程中止异常的发生
  • @Avinash,它确实避免了异常,但它也不会关闭响应,因此在您自己调用End 之前不会发生重定向。调用End时,还是会抛出异常。
  • 如果您将false 传递到第二个重载中,它不会自动调用End。但是,在您对该响应调用 End 之前,您请求的重定向不会发生,因此当您自己调用 End 时,您仍然会收到异常。抛出异常的不是Redirect方法,而是End方法。
【解决方案3】:

发生这种情况是因为您在 try/catch 块内进行重定向。不要这样做。

【讨论】:

    【解决方案4】:

    在重定向方法中提及 false 就足够了,例如, Response.Redirect("目标页面", false);

    【讨论】:

    • 欢迎来到 SO!虽然这是一个答案,但如果它有更多关于为什么会起作用的详细信息可能会更有用,所以如果你添加更多信息,你的帖子可能会更好。
    【解决方案5】:
    Response.Redirect("Location", false);
    

    没有“ThreadAbortException”也能正常工作。

    【讨论】:

      猜你喜欢
      • 2012-08-19
      • 1970-01-01
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      • 2011-06-03
      • 2011-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多