Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 何时最好使用false作为Response.Redirect的第二个参数,何时不使用?_C#_Asp.net - Fatal编程技术网

C# 何时最好使用false作为Response.Redirect的第二个参数,何时不使用?

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()后面/下面的语句 在这里,客户端将被重定向到新页面,但仍将由

一般来说,对于.NET,每个人都建议使用:

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表单工作了。)