.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
相关产品推荐
相关产品推荐

