当我使用Response.Redirect(…)将我的表单重定向到一个新页面时,我得到了错误:

类型为'System.Threading '的第一次机会异常。mscorlib.dll中出现ThreadAbortException ` System.Threading类型的异常。在mscorlib.dll中出现ThreadAbortException',但在用户代码中没有处理

我对此的理解是,该错误是由web服务器中止余下的页面响应引起的。重定向被调用。

I know I can add a second parameter to Response.Redirect that is called endResponse. If I set endResponse to True I still get the error but if I set it to False then I do not. I am pretty sure though that that means the webserver is running the rest of the page I redirected away from. Which would seem to be inefficient to say the least. Is there a better way to do this? Something other than Response.Redirect or is there a way to force the old page to stop loading where I will not get a ThreadAbortException?


当前回答

我要做的就是捕捉这个异常,以及其他可能的异常。希望这能帮助到一些人。

 catch (ThreadAbortException ex1)
 {
    writeToLog(ex1.Message);
 }
 catch(Exception ex)
 {
     writeToLog(ex.Message);
 }

其他回答

我甚至试图避免这一点,以防万一在线程上手动做中止,但我宁愿留下它与“CompleteRequest”和继续-我的代码有返回命令后重定向无论如何。这是可以做到的

public static void Redirect(string VPathRedirect, global::System.Web.UI.Page Sender)
{
    Sender.Response.Redirect(VPathRedirect, false);
    global::System.Web.UI.HttpContext.Current.ApplicationInstance.CompleteRequest();
}

下面是关于这个问题的官方说法(我找不到最新的,但我认为。net的后续版本情况没有改变)

这就是如何响应。重定向(url, true)工作。它抛出ThreadAbortException以中止线程。忽略这个异常。(我假设它是一些全局错误处理程序/记录器,你看到它了吗?)

一个有趣的相关讨论Response.End()是否被认为有害?

redirect()抛出异常终止当前请求。

这篇KB文章描述了这种行为(也适用于Request.End()和Server.Transfer()方法)。

对于Response.Redirect()存在重载:

Response.Redirect(String url, bool endResponse)

如果传递endResponse=false,则不会抛出异常(但运行时将继续处理当前请求)。

如果endResponse=true(或者使用了其他重载),则抛出异常,当前请求将立即终止。

我也尝试了其他解决方案,但一些代码执行后重定向。

public static void ResponseRedirect(HttpResponse iResponse, string iUrl)
    {
        ResponseRedirect(iResponse, iUrl, HttpContext.Current);
    }

    public static void ResponseRedirect(HttpResponse iResponse, string iUrl, HttpContext iContext)
    {
        iResponse.Redirect(iUrl, false);

        iContext.ApplicationInstance.CompleteRequest();

        iResponse.BufferOutput = true;
        iResponse.Flush();
        iResponse.Close();
    }

所以如果需要防止代码执行后重定向

try
{
   //other code
   Response.Redirect("")
  // code not to be executed
}
catch(ThreadAbortException){}//do there id nothing here
catch(Exception ex)
{
  //Logging
}