C# 何时最好使用false作为Response.Redirect的第二个参数,何时不使用?
一般来说,对于.NET,每个人都建议使用:C# 何时最好使用false作为Response.Redirect的第二个参数,何时不使用?,c#,asp.net,C#,Asp.net,一般来说,对于.NET,每个人都建议使用: Response.Redirect("url", false) 而不是 Response.Redirect("url", true) 避免竞争条件,因为后者显然会突然结束过程 在任何情况下,使用true而不是false是否有意义 当重定向不是回发到同一个aspx页面而是重定向到另一个aspx页面时,false比true更合适吗?false将用于不中止线程,以便执行响应.redirect()后面/下面的语句 在这里,客户端将被重定向到新页面,但仍将由
Response.Redirect("url", false)
而不是
Response.Redirect("url", true)
避免竞争条件,因为后者显然会突然结束过程
在任何情况下,使用true
而不是false
是否有意义
当重定向不是回发到同一个aspx页面而是重定向到另一个aspx页面时,
false
比true
更合适吗?false
将用于不中止线程,以便执行响应.redirect()
后面/下面的语句
在这里,客户端将被重定向到新页面,但仍将由服务器执行当前页面
true
将通过中止线程用于重定向,因此响应后/下面的语句将不会执行。redirect()
在这里,客户端将被重定向到新页面,而当前页面将不会被服务器执行。当然,您要使用响应。重定向(“url”,false)
如果它在try catch
块中,请尝试捕获
否则,它将抛出ThreadAbortException
try {
Response.Redirect("url", false);
}
catch(Exception ex) {
// Log exception
}
最简单的方法是,当您想结束响应时使用true
,当您不想结束响应时使用false
。(请注意,true
是默认值,如果在这种情况下没有提供。)
对于初学者来说,以这种方式结束响应将引发ThreadAbortException
,因此一般来说,如果可能的话,我会避免它。多年来,这种异常情况让许多ASP.NET开发人员在生产环境中大吃一惊。当没有异常发生时,不需要抛出异常,只需要正常的逻辑流
我想说的是,最佳实践是相应地构造逻辑流,这样就可以在不中断线程的情况下结束执行。在许多情况下,一个简单的返回代码>在响应之后。重定向()
完成该操作。在更复杂的情况下(也就是说,在整个大型代码隐藏方法中有大量的返回;
路径),问题可能不在于重定向,而在于失控的方法大小,需要重构为更易于管理的方法
请记住,Response.Redirect()
不是退出方法的方法。忘记你正在执行重定向的事实,并认为这是一个正常的C代码,其中逻辑流需要相应地退出该方法。如果Response.Redirect()
是该方法所做的最后一件事,或者逻辑流通常所做的最后一件事,那么您应该不会有问题。如果Response.Redirect(“url”,false)是在事件处理程序的内部方法中执行的,线程是在内部方法以return结束时结束,还是在整个事件处理程序执行完毕时结束?@Pep:如果重定向是多个方法深度的,则代码执行将继续备份堆栈。中止线程会杀死该堆栈,但会以异常为代价。因此,如果MethodA()
调用MethodB()
并且后者执行重定向,当控件返回到前者时,它仍将执行。理想情况下,逻辑不应该如此复杂,以至于成为一个问题。如果是,将重定向条件视为退出逻辑并相应地构造代码的条件。也就是说,忘记重定向本身,集中精力尝试从MethodB()
有效地“返回”。谢谢,明白了。但是,其中一个重定向发生在Page_Init中,它检查会话变量是否为null(过期会话),如果为null,则重定向到登录页面。在这种情况下,我理解“true”更有意义,可以避免其他事件(如Page_Load)在Page_Init中重定向后继续执行。“我的假设正确吗?”佩普:也许,这是值得检验的。页面生命周期与标准逻辑流是分开的,可以检查这些条件。(我不能肯定,我已经很久没有做过Web表单工作了。)