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

ASP.NET Core API 如何添加自定义路由令牌解析器支持[namespace]路由

解决方案

完全可以通过ASP.NET Core原生的IApplicationModelConvention接口实现自定义路由令牌解析,不需要硬编码路由也不需要额外引入源代码生成器,完全兼容你使用的ApiEndpoints库的单控制器单Action设计,具体实现步骤如下:

1. 实现自定义路由公约类

该类用于扫描所有控制器的路由模板,自动替换[namespace]令牌为你指定的命名空间对应值:

using Microsoft.AspNetCore.Mvc.ApplicationModels;
using System.Linq;

public class NamespaceRouteTokenConvention : IApplicationModelConvention
{
    public void Apply(ApplicationModel application)
    {
        foreach (var controller in application.Controllers)
        {
            // 筛选带路由特性的控制器
            var routeSelectors = controller.Selectors.Where(s => s.AttributeRouteModel != null);
            foreach (var selector in routeSelectors)
            {
                var routeTemplate = selector.AttributeRouteModel.Template;
                if (!routeTemplate.Contains("[namespace]")) continue;
                
                // 可按需调整命名空间的截取规则,示例取命名空间最后一段作为路由值
                var namespaceSegments = controller.ControllerType.Namespace.Split('.');
                // 如需取多层命名空间作为路由前缀(比如Api/V1/Orders),可自行调整截取的索引范围后用/拼接
                var namespaceRouteValue = namespaceSegments.Last().ToLower();
                
                // 替换自定义令牌
                selector.AttributeRouteModel.Template = routeTemplate.Replace("[namespace]", namespaceRouteValue);
            }
        }
    }
}

2. 在Startup中注册公约

修改Startup.cs的ConfigureServices方法,将上述自定义公约注册到MVC配置中:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers(options =>
    {
        // 注册自定义路由令牌解析公约
        options.Conventions.Add(new NamespaceRouteTokenConvention());
    });
}

3. 直接使用[namespace]路由标记

你可以直接在控制器上使用[Route("[namespace]/[action]")]这类路由规则,比如你目录中Orders文件夹下的Create控制器,命名空间如果是YourProject.Controllers.Orders,最终生成的路由就是orders/create,完全适配ApiEndpoints的设计规范。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 03:33:00