ASP.NET中Response.Redirect(false)+Response.End()与Response.Redirect()是否等价?
关于ASP.NET Web Form中Response.Redirect与Response.End组合的疑问
我在查看一个ASP.NET Web Form项目按钮点击事件的后台(aspx.cs)代码时,遇到一段无法理解的代码:
this.Response.Redirect("url", false); this.Response.End();
我认为这段代码似乎等价于:
this.Response.Redirect("url");
已知各方法作用:
this.Response.Redirect("url", false);——重定向且不终止当前线程this.Response.Redirect("url", true);——重定向并通过ThreadAbortException终止当前线程this.Response.Redirect("url");——默认调用带true的重载,即重定向并通过ThreadAbortException终止当前线程this.Response.End();——通过ThreadAbortException终止当前线程,若失败则直接将当前响应发送给客户端
想请教这段代码是存在我未理解的逻辑,还是属于冗余错误代码?
结论:这是冗余且有潜在风险的代码,实际效果等价于Response.Redirect("url"),但完全没必要这么写
详细分析:
行为本质一致
Response.Redirect("url", false)只是发送重定向响应头但不终止线程,紧接着调用Response.End()会立刻抛出ThreadAbortException终止当前线程——这和直接调用Response.Redirect("url")(默认重载即Redirect(url, true))的逻辑完全重合:发送重定向头+终止线程。冗余且存在隐患
- 多调用一次
Response.End()纯粹是画蛇添足,属于冗余代码。 - 更糟的是,
Response.End()在抛出异常失败时会直接强制发送当前响应。如果极端场景下Redirect的响应头还没完全写入到输出流,可能导致客户端收到不完整的响应,引发奇怪的错误;而Response.Redirect("url")的内部实现会确保重定向头先正确写入,再执行线程终止,可靠性更高。
- 多调用一次
出现这种写法的原因
大概率是开发者对Redirect的重载逻辑理解不到位:误以为用Redirect(false)后必须手动终止线程,于是额外加了Response.End()。但实际上,如果需要终止线程,直接用Redirect(url)或Redirect(url, true)就够了;只有当你需要发送重定向后继续执行后台逻辑(比如记录日志、清理资源),才应该用Redirect(url, false)且不要调用Response.End()。
内容的提问来源于stack exchange,提问作者Skary
相关产品推荐
相关产品推荐

