如何为ASP.NET Core中未定义的请求添加默认路由
处理ASP.NET Core未匹配路由的解决方案
你之前添加的中间件未生效,是因为它被放在了app.Run()之后——app.Run()是终端中间件,执行后不会再处理后续代码。针对未匹配路由的场景,以下是几种可行的处理方式:
方案1:使用MapFallback(官方推荐)
ASP.NET Core 3.0+提供了MapFallback方法,专门用于匹配所有未被前面路由规则命中的请求,优先级最低。只需在app.MapControllers();之后添加代码:
app.MapFallback(async context => { context.Response.StatusCode = StatusCodes.Status404NotFound; await context.Response.WriteAsync("Page not found"); });
修改后的完整Program.cs:
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); var app = builder.Build(); app.UseStaticFiles(); app.UseRouting(); app.MapControllers(); // 处理未匹配的请求 app.MapFallback(async context => { context.Response.StatusCode = StatusCodes.Status404NotFound; await context.Response.WriteAsync("Page not found"); }); app.Run();
方案2:通过中间件拦截404响应
调整中间件顺序,在路由处理完成后检查响应状态,处理未匹配的请求。将中间件放在UseRouting()之后、MapControllers()之前:
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); var app = builder.Build(); app.UseStaticFiles(); app.UseRouting(); // 404处理中间件 app.Use(async (context, next) => { await next(); // 先执行前面的路由和中间件逻辑 // 仅处理未被响应的404请求 if (context.Response.StatusCode == StatusCodes.Status404NotFound && !context.Response.HasStarted) { context.Response.StatusCode = StatusCodes.Status404NotFound; await context.Response.WriteAsync("Page not found"); } }); app.MapControllers(); app.Run();
方案3:用控制器全局捕获未匹配路由
创建一个错误控制器,添加一个匹配任意路由的Action(设置Order = int.MaxValue确保最后匹配):
using Microsoft.AspNetCore.Mvc; namespace ControllersExample.Controllers { public class ErrorController : Controller { // 匹配所有未被其他路由命中的请求 [Route("{*url}", Order = int.MaxValue)] public ContentResult PageNotFound() { Response.StatusCode = StatusCodes.Status404NotFound; return Content("Page not found", "text/plain"); } } }
无需修改Program.cs,所有未定义的路由都会自动导向这个Action。
内容的提问来源于stack exchange,提问作者user29622567
相关产品推荐
相关产品推荐

