Response.Redirect异常

时间:2011-01-04 11:11:01

标签: asp.net

执行以下行:

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

结果:

A first chance exception of type 'System.Threading.ThreadAbortException' occurred in mscorlib.dll
An exception of type 'System.Threading.ThreadAbortException' occurred in mscorlib.dll but was not handled in user code

例外是由于“真实”部分,告诉它立即结束当前请求。

它应该如何?
如果我们考虑:

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

是否有其他方法可以实现相同的目标?

3 个答案:

答案 0 :(得分:6)

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

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

- 帕维尔

答案 1 :(得分:6)

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

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

当然,这取决于逻辑流程中重定向的位置。但是你想要处理它很好。但是这个想法是,当你想要终止重定向的响应时,通过return退出有问题的方法并不是不可能的。

我看到人们常常采用一种方法来解决这个问题,不应该说这是应该避免的,但是为了完整性我还是要说出来(你永远不知道谁会偶然发现这个问题)之后通过谷歌等),是为了捕获并吞下例外:

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

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

答案 2 :(得分:0)

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

对于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发布的相同链接。

问候。