You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core Razor Pages错误页无法显示问题求助

问题排查与解决方案

核心问题分析

  1. Error页面未开放匿名访问:ErrorModel未添加[AllowAnonymous]特性,未登录用户访问/Error时会被认证中间件拦截,强制重定向到Login页面,这就是URL跳转到https://localhost:44386/Login?ReturnUrl=%2F的直接原因。
  2. 前端代码编译错误:Error.cshtml中@if (Model.ExceptionInDbId != 0 && Model.ExceptionInDbId != null)的条件逻辑错误——ExceptionInDbId是long值类型,永远不可能为null,该条件会触发编译异常,进而引发新的500错误。
  3. 中间件重复注册:program.cs中三次调用app.UseExceptionHandler("/Error"),重复注册会导致异常处理逻辑混乱。
  4. 服务注入冗余:多次重复注入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页面
}

验证步骤

  1. 重新编译并启动应用
  2. 触发一个内部错误,确认异常信息成功写入数据库
  3. 检查是否正确跳转到Error.cshtml页面并显示错误ID
  4. 验证未登录状态下访问错误页面,不会被重定向到Login

内容的提问来源于stack exchange,提问作者PEDRAM POURHAKIM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 19:39:52