ASP.NET:Response.Redirect(...)之后的代码会发生什么?

时间:2009-08-09 22:02:44

标签: asp.net page-lifecycle

Response.Redirect()会导致当前运行的方法中止吗?或者Response.Redirect()之后的代码也执行吗?

(也就是说,在Response.Redirect之后是否需要返回/退出Sub?)

4 个答案:

答案 0 :(得分:47)

Response.Redirect有一个重载,接受一个布尔参数,指示对Response.Redirect的调用是否结束响应。在没有此参数的情况下调用重载与指定true以指示响应应该结束相同。

结束响应意味着在修改响应后调用Response.End以使重定向发生,Response.End抛出ThreadAbortException以终止响应当前模块。

调用Response.Redirect后的任何代码都不会被调用(除非您为额外参数提供false)。实际上,finally和某些catch处理程序中的代码将会执行,但您无法吞下 ThreadAbortException

答案 1 :(得分:28)

这可能不是一个完整的答案,但是从我所看到的......

Response.Redirect确实会导致代码因抛出System.Threading.ThreadAbortException而停止执行。

您可以通过在Global.Asax中设置全局错误处理并测试Response.Redirect来自行查看。

修改

以下是支持我的答案的文档的链接:

  

重定向呼叫结束提升a   ThreadAbortException异常   完成。

HttpResponse.Redirect Method (String, Boolean) (System.Web)

答案 2 :(得分:3)

Response.Redirect还有另一个名为endResponse的参数。当你在try catch块中重定向时,将它设置为false是一个好主意,因为上下文仍需要控制才能正确。所以你的catch块会获得异常。

需要注意的是,当页面不是Cancelable时,它不会尝试获得控制权。最常见的情况是Global.asax。因此,您不必担心该上下文中的此异常。如果您不相信我,请尝试反映此方法的代码并查看。

所以为了回答你的问题,当你将endResponse设置为true时,没有必要在Response.Redirect之后做很多事情,默认情况下(即使用不带bool的方法调用)。

答案 3 :(得分:1)

我的理解是,在发出Response.Redirect()后,其后面的代码将不会执行。如果你考虑一下,不执行它是有道理的。你基本上是在告诉你的代码你想去其他地方。

示例:将其视为在麦当劳订购价值餐。在你订购之后,他们开始喝你的饮料,你改变了主意并说“你知道什么,忘了我的订单。我将重定向我自己去Wendy's。”那时,他们会停止制作你的薯条和汉堡,因为,好吧......你已经决定去其他地方 - 即重定向回复。