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

.NET 6 ASP.NET Web控制器如何在路由模板中使用自定义占位符

实现方案

在.NET 6中完全可以实现你的需求,具体分为配置读取、路由动态替换、Swagger适配三个步骤:

1. 添加配置项

首先在appsettings.json中定义默认的项目API名称,方便启动时灵活覆盖:

{
  "ApiSettings": {
    "ProjectApiName": "api"
  }
}

2. 绑定配置模型并注册核心服务

创建配置模型类,用于统一读取配置值:

public class ApiSettings
{
    public string ProjectApiName { get; set; } = "api";
}

在Program.cs中完成配置绑定、控制器及API版本服务的注册:

var builder = WebApplication.CreateBuilder(args);

// 绑定配置到模型
var apiSettings = builder.Configuration.GetSection("ApiSettings").Get<ApiSettings>();
builder.Services.Configure<ApiSettings>(builder.Configuration.GetSection("ApiSettings"));

// 添加控制器与API版本支持,同时注册自定义路由约定
builder.Services.AddControllers(options =>
{
    options.Conventions.Add(new ProjectApiNameRouteConvention(apiSettings.ProjectApiName));
})
.AddApiVersioning(options =>
{
    options.ReportApiVersions = true;
    options.AssumeDefaultVersionWhenUnspecified = true;
    options.DefaultApiVersion = new ApiVersion(1, 0);
});

3. 实现自定义路由约定

创建路由约定类,动态替换控制器路由模板中的{myProjectApiName}占位符为配置的实际值:

public class ProjectApiNameRouteConvention : IApplicationModelConvention
{
    private readonly string _projectApiName;

    public ProjectApiNameRouteConvention(string projectApiName)
    {
        _projectApiName = projectApiName ?? "api";
    }

    public void Apply(ApplicationModel application)
    {
        foreach (var controller in application.Controllers)
        {
            foreach (var selector in controller.Selectors)
            {
                if (selector.AttributeRouteModel?.Template != null && selector.AttributeRouteModel.Template.Contains("{myProjectApiName}"))
                {
                    selector.AttributeRouteModel.Template = selector.AttributeRouteModel.Template.Replace("{myProjectApiName}", _projectApiName);
                }
            }
        }
    }
}

4. 适配Swagger显示

由于自定义路由约定已经修改了控制器的实际路由模板,Swashbuckle会自动读取修改后的路由信息,Swagger UI中显示的接口URL会直接是替换后的真实路径(比如/myproj1-api/v1/testData)。

如果需要让Swagger自身的访问路径也带上项目API名称前缀,可调整Swagger配置:

app.UseSwagger(c =>
{
    c.RouteTemplate = $"{apiSettings.ProjectApiName}/swagger/{{documentName}}/swagger.json";
});
app.UseSwaggerUI(c =>
{
    c.SwaggerEndpoint($"/{apiSettings.ProjectApiName}/swagger/v1/swagger.json", "xxx.WebServer v1");
    // 可选:调整Swagger UI的访问路径
    c.RoutePrefix = $"{apiSettings.ProjectApiName}/swagger";
});

5. 启动时覆盖配置值

启动项目时,可通过命令行参数或环境变量快速覆盖默认配置:

  • 命令行方式:
dotnet run --ApiSettings:ProjectApiName=myproj1-api
  • 环境变量方式(Windows):
set ApiSettings__ProjectApiName=myproj2-api
dotnet run

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 12:35:25