Response.Redirect() 会导致当前运行的方法中止吗?还是 Response.Redirect() 之后的代码也执行?
(也就是说,是否需要在 Response.Redirect 之后返回/退出 Sub?)
Response.Redirect() 会导致当前运行的方法中止吗?还是 Response.Redirect() 之后的代码也执行?
(也就是说,是否需要在 Response.Redirect 之后返回/退出 Sub?)
Response.Redirect
有一个接受布尔参数的重载,该参数指示调用是否Response.Redirect
应该结束响应。调用不带此参数的重载与指定true
指示应结束响应相同。
结束响应意味着Response.End
在响应被修改以使重定向发生后调用,并Response.End
抛出一个ThreadAbortException
终止当前模块。
调用后的任何代码Response.Redirect
都不会被调用(除非您提供false
额外的参数)。实际上,其中的代码finally
和某些处理程序将执行catch
,但您不能吞下ThreadAbortException
.
这可能不是一个完整的答案,但从我所看到的......
Response.Redirect 实际上会通过抛出 System.Threading.ThreadAbortException 导致代码停止执行。
您可以通过在 Global.Asax 中设置全局错误处理并测试 Response.Redirect 来亲眼看到这一点。
编辑
这是支持我的回答的文档的链接:
重定向调用 End 在完成时引发 ThreadAbortException 异常。
Response.Redirect 的另一个参数称为 endResponse。当您在 try catch 块中重定向时,将其设置为 false 是一个好主意,因为上下文仍然需要控制才能正确。因此,您的 catch 块将获取异常。
需要注意的是,当页面不可取消时,它不会尝试获得控制权。最常见的情况是 Global.asax。因此,在这种情况下,您无需担心此异常。如果您不相信我,请尝试反映此方法的代码并查看一下。
因此,要回答您的问题,当您将 endResponse 设置为 true 时(即使用不带布尔值的方法调用),在 Response.Redirect 之后不需要做太多事情。
我的理解是,在发出 Response.Redirect() 后,它后面的代码将不会执行。如果您考虑一下,不执行它是有道理的。您基本上是在告诉您的代码您想去其他地方。
示例:将其想象为在麦当劳订购超值餐点。在您订购它并且他们开始为您添加饮料后,您改变主意并说“你知道吗,忘记我的订单。我将自己重定向到 Wendy's。” 到那时,他们将停止为您制作薯条和汉堡,因为,嗯……您已经决定去其他地方——即重定向响应。