.NET Core 6中Response.Redirect跳转后代码未终止问题
问题根源
该问题确实和你使用的.NET 6框架版本有关,属于ASP.NET Core和传统.NET Framework的行为差异:
Response.Redirect()的第二个endResponse参数在ASP.NET Core中不再具备终止执行流的作用,仅为兼容旧版代码保留,不会像.NET Framework那样通过抛出线程中断异常阻止后续代码运行。HttpResponse.End()方法在ASP.NET Core中已被完全移除,这是你调用该方法出现编译错误的直接原因,旧版Framework依赖IIS集成管道实现的End逻辑在Core的全新请求管道中不再存在。
修复方案
方案1(推荐,符合框架约定)
将OnGet方法的返回值从void改为IActionResult,跳转时直接返回Redirect结果,从执行流层面直接切断后续逻辑运行,也是Razor Pages的标准写法:
public IActionResult OnGet() { string id = Request.Query["id"]; if (!int.TryParse(id, out int value) || value == 0) { return Redirect("/Clients/Index"); } try { using (SqlConnection connection = new(connectionString)) { connection.Open(); string sql = "SELECT * FROM clients WHERE id = @id"; using (SqlCommand command = new(sql, connection)) { // 原有数据库查询逻辑 } } } // 其余原有逻辑... return Page(); }
方案2(最小改动)
如果不想修改方法签名,在手动调用Response.Redirect()后直接添加return语句,手动终止当前方法执行:
if (!int.TryParse(id, out int value) || value == 0) { Response.Redirect("/Clients/Index", true); return; // 手动阻断后续代码执行 }
注意:不要尝试通过抛出异常的方式模拟旧版
Response.End()的终止效果,会产生不必要的性能开销,还可能被框架全局异常处理逻辑拦截导致跳转失败。
内容的提问来源于stack exchange,提问作者Galivan
相关产品推荐
相关产品推荐

