如果使用 Response.End、Response.Redirect 或 Server.Transfer,则发生 ThreadAbortException

本文帮助您解决使用 、 或 时发生的 ThreadAbortException Response.End Response.Redirect 错误 Server.Transfer

原始产品版本:  ASP.NET 4.5.2 .NET Framework 4.5.2 上 ASP.NET 3.5 Service Pack 1 .NET Framework 1
原始 KB 编号:   312629

症状

如果使用 、 Response.End Response.Redirect 或 方法, Server.Transfer 则会发生 ThreadAbortException 异常。 可以使用语句 try-catch 捕获此异常。

原因

Response.End该方法结束页面执行,将执行转移到Application_EndRequest管道中的事件。 不执行以下 Response.End 代码行。

此问题在 和 方法 Response.RedirectServer.Transfer 出现,因为这两种方法在内部调用 Response.End。

解决方案

若要解决此问题,请使用下列方法之一:

  • 对于 Response.EndHttpContext.Current.ApplicationInstance.CompleteRequest 调用 方法, Response.End 而不是绕过对 事件的代码 Application_EndRequest 执行。

  • 对于 Response.Redirect ,使用重载 Response.Redirect (String url, bool endResponse) ,为 endResponse 参数传递 false 以禁止对 的内部调用 Response.End 。 例如:

     Response.Redirect ("nextpage.aspx", false);
    

    如果使用此解决方法,将执行以下 Response.Redirect 代码。

  • 对于 Server.Transfer ,请 Server.Execute 改为使用 方法。

尽管 ASP.NET 处理此异常,但您可以使用 try-catch 语句捕获此异常。 例如:

try
{
    Response.Redirect("nextpage.aspx");
}
catch (Exception ex)
{
    Response.Write (ex.Message);
}

在行上添加一个断点 Response.Write ,注意此断点已命中。 检查异常时,请注意发生 ThreadAbortException 异常。