当我使用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);
 }

其他回答

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

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

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

我知道我迟到了,但我只有在响应时才会出现这种错误。重定向正在尝试中…Catch块。

永远不要放一个响应。重定向到尝试…Catch块。这是不好的做法

作为放置响应的替代方法。重定向到尝试…Catch块,我将把方法/函数分解为两个步骤。

在Try…Catch块执行请求的操作,并设置一个“结果”值来指示操作的成功或失败。 在Try…Catch块是否重定向取决于“结果”值是什么。

这段代码远非完美,可能不应该复制,因为我还没有测试过它。

public void btnLogin_Click(UserLoginViewModel model)
{
    bool ValidLogin = false; // this is our "result value"
    try
    {
        using (Context Db = new Context)
        {
            User User = new User();

            if (String.IsNullOrEmpty(model.EmailAddress))
                ValidLogin = false; // no email address was entered
            else
                User = Db.FirstOrDefault(x => x.EmailAddress == model.EmailAddress);

            if (User != null && User.PasswordHash == Hashing.CreateHash(model.Password))
                ValidLogin = true; // login succeeded
        }
    }
    catch (Exception ex)
    {
        throw ex; // something went wrong so throw an error
    }

    if (ValidLogin)
    {
        GenerateCookie(User);
        Response.Redirect("~/Members/Default.aspx");
    }
    else
    {
        // do something to indicate that the login failed.
    }
}

正确的模式是使用endResponse=false调用重定向重载,并调用IIS管道,一旦你返回控制,它应该直接进入EndRequest阶段:

Response.Redirect(url, false);
Context.ApplicationInstance.CompleteRequest();

Thomas Marquardt的这篇博客文章提供了更多的细节,包括如何处理Application_Error处理程序内部重定向的特殊情况。

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

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