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

如何让C#/.NET项目路由到自定义404错误页面?

问题排查与修复步骤

1. 调整中间件执行顺序

中间件顺序直接决定功能是否生效,需将错误处理相关中间件放在正确位置,同时替换重定向方式以保留原始状态码:

修改Program.cs中的管道配置:

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
}
else
{
    // 用服务器端重执行替代客户端重定向,保留原始错误状态码
    app.UseStatusCodePagesWithReExecute("/Error/Error/{0}");
    // 捕获全局未处理异常
    app.UseExceptionHandler("/Error/Handle500Error");
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

// 原有路由配置保持不变
app.MapControllerRoute(
    name: "aboutUs",
    pattern: "aboutUs/{action}",
    defaults: new { controller = "AboutUs", action = "Index"});
app.MapControllerRoute( 
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

2. 完善Error控制器路由与逻辑

给控制器添加路由属性确保请求能正确匹配,同时增强异常与状态码处理:

using Microsoft.AspNetCore.Diagnostics;
using Microsoft.AspNetCore.Mvc;

[Route("[controller]/[action]")]
public class ErrorController : Controller
{
    // 处理指定状态码的错误请求
    public IActionResult Error(int statusCode)
    {
        // 获取原始请求路径
        var originalPath = HttpContext.Features.Get<IStatusCodeReExecuteFeature>()?.OriginalPath;
        
        ViewBag.OriginalPath = originalPath;
        ViewBag.StatusCode = statusCode;

        return statusCode switch
        {
            404 => View("NotFound"),
            500 => View("GenError"),
            _ => View("GenError")
        };
    }

    // 处理全局未捕获的服务器异常
    public IActionResult Handle500Error()
    {
        var exceptionFeature = HttpContext.Features.Get<IExceptionHandlerPathFeature>();
        if (exceptionFeature != null)
        {
            ViewBag.ErrorMessage = exceptionFeature.Error.Message;
            ViewBag.OriginalPath = exceptionFeature.Path;
        }

        return View("GenError");
    }
}

3. 确认视图文件配置

  • 确保Views/Error/NotFound.cshtml和Views/Error/GenError.cshtml存在,且视图顶部引用布局文件:
@{
    Layout = "_Layout";
}
  • 可在视图中添加状态码和路径展示,方便测试验证:
<h1>@ViewBag.StatusCode 错误</h1>
<p>请求路径 @ViewBag.OriginalPath 无法访问</p>

4. 环境与功能验证

  • 切换到非开发环境测试:修改launchSettings.json中ASPNETCORE_ENVIRONMENT为Production,或直接部署测试。
  • 测试404:访问不存在的路径(如/NonExistPage),应显示自定义NotFound页面。
  • 测试500:在任意Action中手动抛出异常(如throw new Exception("测试服务器错误");),访问该Action应显示GenError页面。

内容的提问来源于stack exchange,提问作者Chris Ryan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 03:17:27