42

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

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

4

4 回答 4

55

Response.Redirect有一个接受布尔参数的重载,该参数指示调用是否Response.Redirect应该结束响应。调用不带此参数的重载与指定true指示应结束响应相同。

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

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

于 2009-08-09T22:30:08.973 回答
29

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

Response.Redirect 实际上会通过抛出 System.Threading.ThreadAbortException 导致代码停止执行。

您可以通过在 Global.Asax 中设置全局错误处理并测试 Response.Redirect 来亲眼看到这一点。

编辑

这是支持我的回答的文档的链接:

重定向调用 End 在完成时引发 ThreadAbortException 异常。

HttpResponse.Redirect 方法(字符串,布尔值)(System.Web)

于 2009-08-09T22:14:37.897 回答
3

Response.Redirect 的另一个参数称为 endResponse。当您在 try catch 块中重定向时,将其设置为 false 是一个好主意,因为上下文仍然需要控制才能正确。因此,您的 catch 块将获取异常。

需要注意的是,当页面不可取消时,它不会尝试获得控制权。最常见的情况是 Global.asax。因此,在这种情况下,您无需担心此异常。如果您不相信我,请尝试反映此方法的代码并查看一下。

因此,要回答您的问题,当您将 endResponse 设置为 true 时(即使用不带布尔值的方法调用),在 Response.Redirect 之后不需要做太多事情。

于 2009-08-09T22:32:43.960 回答
1

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

示例:将其想象为在麦当劳订购超值餐点。在您订购它并且他们开始为您添加饮料后,您改变主意并说“你知道吗,忘记我的订单。我将自己重定向到 Wendy's。” 到那时,他们将停止为您制作薯条和汉堡,因为,嗯……您已经决定去其他地方——即重定向响应。

于 2009-08-09T22:20:07.540 回答