.NET Core 6.0中RouteTable被移除,删除路由的替代方案是什么?
在.NET Core 6.0中替代RouteTable删除路由的方案
.NET Core 6+已经弃用了RouteTable,转而使用端点路由系统,以下是几种可行的替代方案:
1. 直接移除已注册的端点
在路由注册完成后,通过WebApplication的DataSources集合找到目标路由端点并移除,适合处理已添加的路由(比如第三方组件注册的路由):
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); var app = builder.Build(); // 先注册控制器路由 app.MapControllers(); // 定位要删除的路由(通过DisplayName匹配,可根据实际路由信息调整) var targetDataSource = app.DataSources.FirstOrDefault(ds => ds.Endpoints.Any(e => e.DisplayName.Contains("HomeController.Index")) ); if (targetDataSource != null) { app.DataSources.Remove(targetDataSource); } app.Run();
2. 使用自定义路由约定排除路由
通过实现IApplicationModelConvention,在应用模型构建阶段直接排除指定的控制器或动作,适合启动阶段就确定要禁用的路由:
自定义约定类
public class ExcludeSpecifiedRoute : IApplicationModelConvention { private readonly string _controller; private readonly string _action; public ExcludeSpecifiedRoute(string controller, string action) { _controller = controller; _action = action; } public void Apply(ApplicationModel application) { var targetController = application.Controllers.FirstOrDefault(c => c.ControllerName.Equals(_controller, StringComparison.OrdinalIgnoreCase) ); if (targetController != null) { var targetAction = targetController.Actions.FirstOrDefault(a => a.ActionName.Equals(_action, StringComparison.OrdinalIgnoreCase) ); if (targetAction != null) { targetController.Actions.Remove(targetAction); } } } }
注册约定
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(options => { // 排除Home控制器的Index动作 options.Conventions.Add(new ExcludeSpecifiedRoute("Home", "Index")); }); var app = builder.Build(); app.MapControllers(); app.Run();
3. 中间件拦截目标路由
通过自定义中间件,在请求到达路由匹配前拦截指定路径,返回404或直接终止请求,适合动态判断是否禁用路由的场景:
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); var app = builder.Build(); // 注意:该中间件要放在路由中间件之前 app.Use(async (context, next) => { var requestPath = context.Request.Path.Value?.ToLowerInvariant(); // 匹配要拦截的路由路径 if (requestPath == "/home/index") { context.Response.StatusCode = StatusCodes.Status404NotFound; return; } await next.Invoke(); }); app.MapControllers(); app.Run();
方案选择建议
- 若需移除已注册的端点(如第三方路由),优先选方案1;
- 若启动阶段就确定要禁用特定控制器/动作,优先选方案2;
- 若需动态条件判断是否禁用路由,优先选方案3。
内容的提问来源于stack exchange,提问作者Xia
相关产品推荐
相关产品推荐

