如何让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
相关产品推荐
相关产品推荐

