ASP.NET Core Razor Pages错误页无法显示问题求助
问题排查与解决方案
核心问题分析
- Error页面未开放匿名访问:
ErrorModel未添加[AllowAnonymous]特性,未登录用户访问/Error时会被认证中间件拦截,强制重定向到Login页面,这就是URL跳转到https://localhost:44386/Login?ReturnUrl=%2F的直接原因。 - 前端代码编译错误:
Error.cshtml中@if (Model.ExceptionInDbId != 0 && Model.ExceptionInDbId != null)的条件逻辑错误——ExceptionInDbId是long值类型,永远不可能为null,该条件会触发编译异常,进而引发新的500错误。 - 中间件重复注册:
program.cs中三次调用app.UseExceptionHandler("/Error"),重复注册会导致异常处理逻辑混乱。 - 服务注入冗余:多次重复注入
IHttpContextAccessor,可能引发服务解析冲突。
分步解决方案
1. 为Error页面添加匿名访问权限
在ErrorModel类上添加[AllowAnonymous]特性,确保未登录用户也能访问错误页面:
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] [IgnoreAntiforgeryToken] [AllowAnonymous] // 新增匿名访问特性 public class ErrorModel : PageModel { // 原有代码保持不变 }
2. 修复前端页面的条件判断错误
删除Error.cshtml中多余的Model.ExceptionInDbId != null判断:
@if (Model.ExceptionInDbId != 0) { <h1 style="color:red">خطایی رخ داده است، کد خطا: @Model.ExceptionInDbId</h1> }
3. 清理重复的ExceptionHandler中间件
在program.cs中只保留一次app.UseExceptionHandler("/Error"),并调整到正确的中间件顺序:
// 简化环境判断中的异常处理配置 if (app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error"); app.UseHsts(); } else { app.UseExceptionHandler("/Error"); app.UseHsts(); } // 后续中间件顺序保持正确 app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.MapRazorPages();
注意:删除代码中最后单独的app.UseExceptionHandler("/Error")调用。
4. 清理冗余的IHttpContextAccessor注入
在program.cs中只保留一次AddHttpContextAccessor(),删除其他重复注入代码:
// 仅保留这一行注入 builder.Services.AddHttpContextAccessor(); // 删除以下冗余代码: // builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); // builder.Services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
5. 优化ErrorModel的重定向逻辑
改用Razor Pages原生的RedirectToPage方法替代直接操作HttpContext,确保符合框架请求流程:
// 修改OnGet方法的返回类型为IActionResult public async Task<IActionResult> OnGet() { var exceptionFeature = contextAccessor.HttpContext.Features.Get<IExceptionHandlerPathFeature>(); if (exceptionFeature != null) { string routeWhereExceptionOccurred = exceptionFeature.Path; exceptionThatOccurred = exceptionFeature.Error; try { if (exceptionThatOccurred is not null) { ExceptionInDb = new ExceptionLog(exceptionThatOccurred, exceptionThatOccurred.Message,exceptionThatOccurred.StackTrace ,routeWhereExceptionOccurred); await exceptionContext.Exceptions.AddAsync(ExceptionInDb); await exceptionContext.SaveChangesAsync(); ExceptionInDbId = ExceptionInDb.Id; } else { return RedirectToPage("/Login"); } } catch (Exception ex) { _logger.LogError(ex, "保存异常日志到数据库失败"); return RedirectToPage("/Login"); } } return Page(); // 明确返回Error页面 }
验证步骤
- 重新编译并启动应用
- 触发一个内部错误,确认异常信息成功写入数据库
- 检查是否正确跳转到
Error.cshtml页面并显示错误ID - 验证未登录状态下访问错误页面,不会被重定向到Login
内容的提问来源于stack exchange,提问作者PEDRAM POURHAKIM
相关产品推荐
相关产品推荐

