【问题标题】:Why do I get a thrown exception when I run Response.Redirect()?为什么我在运行 Response.Redirect() 时会抛出异常?
【发布时间】:2009-09-01 21:02:49
【问题描述】:

我正在学习 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?这正常吗?我应该对此做些什么吗?异常一般都不是什么好东西,看到这里就吓了一跳。

【问题讨论】:

标签: c# .net asp.net


【解决方案1】:

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

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

Response.Redirect(String url, bool endResponse)

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

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

【讨论】:

  • 我怀疑这实际上是“设计的”,也许是他们设计的不幸结果? ;)
  • “按设计”并不意味着所选设计是完美的 ;-)
【解决方案2】:

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

这是因为在内部,这两个方法都调用了Response.End(),这会立即中止当前的请求处理。 Rick Strahl 有一个 pretty good blog post,它分析了为什么您几乎无法采取任何措施来避免这些异常。

【讨论】:

    【解决方案3】:

    Response.Redirect 在内部调用 Response.End,所以它会抛出异常,请改用:

    Response.Redirect(url, false);
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          这种行为是为了支持旧的 asp 而设计的。这是来自 MS 的链接,描述了您正在经历的事情。

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

          【讨论】:

            【解决方案7】:

            调用仅采用 URL 的 Redirect() 的重载也会导致调用 Response.End() - 这会引发 ThreadAbort 异常,以确保在您的页面/UC 中重定向后没有其他代码运行。

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

            【讨论】:

              【解决方案8】:

              是的。我在这些之后编写了一个退出子代码,但我知道它没有到达。

              我想如果你愿意的话,你可以吃掉例外,然后继续做更​​多的事情,但我不推荐它。

              【讨论】:

                【解决方案9】:

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

                如果您决定接受此例外情况,则应确保您的运行状况监控允许此情况并且不会将其报告为问题,这样您就不会被一堆非技术经理所困试图解释为什么您的网站会抛出如此多的线程中止异常。 (我有一位经理确信所有这些线程中止都会留下一团糟,这当然与线程中止的意图完全相反。)

                【讨论】:

                  猜你喜欢
                  • 2016-06-15
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-04-28
                  • 2013-09-04
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多