Response.Redirect()会导致当前运行的方法中止吗?或者Response.Redirect()之后的代码也执行吗?
(也就是说,在Response.Redirect之后是否需要返回/退出Sub?)
答案 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异常 完成。
答案 2 :(得分:3)
Response.Redirect还有另一个名为endResponse的参数。当你在try catch块中重定向时,将它设置为false是一个好主意,因为上下文仍需要控制才能正确。所以你的catch块会获得异常。
需要注意的是,当页面不是Cancelable时,它不会尝试获得控制权。最常见的情况是Global.asax。因此,您不必担心该上下文中的此异常。如果您不相信我,请尝试反映此方法的代码并查看。
所以为了回答你的问题,当你将endResponse设置为true时,没有必要在Response.Redirect之后做很多事情,默认情况下(即使用不带bool的方法调用)。
答案 3 :(得分:1)
我的理解是,在发出Response.Redirect()后,其后面的代码将不会执行。如果你考虑一下,不执行它是有道理的。你基本上是在告诉你的代码你想去其他地方。
示例:将其视为在麦当劳订购价值餐。在你订购之后,他们开始喝你的饮料,你改变了主意并说“你知道什么,忘了我的订单。我将重定向我自己去Wendy's。”那时,他们会停止制作你的薯条和汉堡,因为,好吧......你已经决定去其他地方 - 即重定向回复。