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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 06:24:25