【问题标题】:Response.Redirect exceptionResponse.Redirect 异常
【发布时间】:2011-06-03 08:07:18
【问题描述】:

执行行:

Response.Redirect("Whateva.aspx", true);

结果:

mscorlib.dll 中发生了“System.Threading.ThreadAbortException”类型的第一次机会异常 mscorlib.dll 中出现“System.Threading.ThreadAbortException”类型的异常,但未在用户代码中处理

异常是因为“true”部分,告诉它立即结束当前请求。

应该是这样吗?
如果我们考虑:

  • 异常通常被认为很重,很多时候提前结束请求的原因是为了避免处理页面的其余部分。
  • 异常会显示在性能监控中,因此监控解决方案会显示错误的异常数量。

有没有其他方法可以达到同样的效果?

【问题讨论】:

标签: asp.net


【解决方案1】:

关于开发人员应避免引发(和捕获)异常这一事实是正确的,因为执行运行时会消耗时间和内存以收集有关特定异常的信息。相反,他(或她)不应该让它们发生(如果可能的话)。

关于 Response.Redirect:此行为是“设计使然”,但您可能希望使用众所周知的解决方法。请阅读this KB article

-- 帕维尔

【讨论】:

  • 引用的知识库文章现在为空。
  • @EvoD 不确定我是否理解,该链接有效并且仍然指向正确的知识库文章。
  • 嗯,我的错。它现在出现在我身上。对不起。
【解决方案2】:

在这种情况下,我通常采取的一种方法是在响应期间不结束响应,而是立即使用return(或其他流控制)跟随它。像这样的:

Response.Redirect("Whateva.aspx", false);
return;

当然,这取决于重定向在您的逻辑流程中发生的位置。但是你想处理它很好。但想法是,当您无论如何都想结束对重定向的响应时,通过return 退出有问题的方法并不是不可能的。

我看到人们经常在这个问题上采取一种方法,不用说这是要避免的,但为了完整起见,我还是要说出来(你永远不知道谁会偶然发现这个问题后来通过谷歌等),就是捕捉并吞下异常:

try
{
    Response.Redirect("Whateva.aspx", true);
}
catch (Exception ex)
{
    // do nothing
}

这当然不应该这样做,原因有很多。正如我从您对异常的描述中推断的那样,您无疑已经知道这是一种不好的做法。但是,正如我所说,在答案中值得注意这一事实。

【讨论】:

    【解决方案3】:

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

    对于 Response.End,调用 HttpContext.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 方法。

    来自: http://support.microsoft.com/kb/312629/en-us

    Volpav 发布的相同链接。

    问候。

    【讨论】:

      猜你喜欢
      • 2012-06-29
      • 1970-01-01
      • 2012-08-19
      • 1970-01-01
      • 1970-01-01
      • 2017-07-10
      • 1970-01-01
      • 2013-12-07
      • 1970-01-01
      相关资源
      最近更新 更多