为什么运行Response.Redirect()时会出现抛出异常?

时间:2009-09-01 21:02:50

标签: c# .net asp.net

我正在学习ASP.NET并且正在查看QueryStrings。

我正在查看的一个示例将按钮挂钩到重定向呼叫:

    protected void btnSubmit_Click(object sender, EventArgs e)
    {
        try
        {
            //throws ThreadAbortException: "Thread was being aborted"
            Response.Redirect("Form2.aspx");
        }
        catch (Exception Ex)
        {
            System.Diagnostics.Debug.WriteLine(Ex.Message);
        }
    }

为什么会在这里抛出ThreadAbortException?这是正常的吗?我应该为此做点什么吗?例外通常不是一件好事,所以当我看到这一点时我感到震惊。

9 个答案:

答案 0 :(得分:14)

这是设计的。此KB article描述了行为(也适用于Request.End()Server.Transfer()方法)。

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

Response.Redirect(String url, bool endResponse)

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

如果 endResponse = true (或者如果使用不带bool参数的重载),则抛出异常并立即终止当前请求。

答案 1 :(得分:3)

这很正常。 Server.Transfer()也会抛出相同的异常。

这是因为在内部,两个方法都调用Response.End(),它会立即中止当前的请求处理。 Rick Strahl有pretty good blog post分析了为什么你几乎没有办法避免这些例外。

答案 2 :(得分:3)

Response.Redirect在内部调用Response.End,因此抛出异常,改为使用:

Response.Redirect(url, false);

答案 3 :(得分:2)

这是正常的,因为这是意味着发生的事情。基本上,当响应设置为重定向时,ASP.NET期望您完全完成请求。它会中止线程,以防止发生任何其他处理(基本上它会为您调用Response.End,并抛出异常)。

在我看来,它有点滥用异常,但这就是它的工作方式。您可以使用具有第二个参数(并传递false)的重载来防止这种情况发生 - 如果您愿意 - 但如果是这样,请确保没有其他任何内容然后尝试写入响应!

答案 4 :(得分:1)

我相信您需要遵循此知识库文章中的说明。 Response.Redirect调用Response.End(),除非您使用专门用于避免此行为的重载。一旦响应结束,就不会发生进一步的操作,因此TA exc。

http://support.microsoft.com/kb/312629

答案 5 :(得分:1)

该行为是设计用于支持旧的asp。以下是MS描述您正在体验的内容的链接。

http://support.microsoft.com/default.aspx?scid=kb;EN-US;312629

答案 6 :(得分:0)

调用刚接受URL的Redirect()的重载也会导致对Response.End()的调用 - 抛出ThreadAbort异常以确保在页面/ UC中重定向之后没有其他代码运行。 / p>

您不应该捕获此异常..您应该在代码中忽略它或使用Redirect()的重载,它接受一个布尔值,指示在重定向后是否继续处理请求。

答案 7 :(得分:0)

呀。我在那之后编写了一个退出子,但我知道它没有达到。

我想如果你想要你可以吃掉这个例外并继续使用更多的东西,但我不推荐它。

答案 8 :(得分:0)

这里已经有了一堆合理的答案。还有一点值得注意。线程中止异常是您可以捕获和编码的罕见异常之一,但您无法抑制。无论你做什么,它都会在任何try / catch / finally块结束时自动重新引发。

如果你决定忍受这个例外,你应该确保你的健康监测允许这个并且不报告它作为一个问题,所以你不要被困在一群非技术经理面前试图解释为什么你的网站抛出如此多的线程中止例外。 (我让一位经理确信所有这些线程堕胎都背后一团糟,当然这与线程中止的意图完全相反。)