如何配置使Swagger展示的接口Action URL为camelCase驼峰格式
问题场景
- 示例接口定义如下:
[HttpGet("api/[controller]/[action]")] public string LogMeIn(...)
- 默认配置下Swagger生成的接口地址为
.../api/Auth/LogMeIn - 已添加全局路由小写配置:
services.AddRouting(opt => opt.LowercaseUrls = true)
- 配置后Swagger展示的URL变为全小写
.../api/auth/logmein,预期需要camelCase格式地址.../api/auth/logMeIn - 原生Swagger配置、ASP.NET Core应用配置均无直接支持该格式的选项,公开检索到的方案大多仅覆盖参数、模型的命名配置,不涉及Swagger UI中展示的URL路径命名规则调整。
可行实现方案
ASP.NET Core 原生的LowercaseUrls配置仅支持全局全小写转换,没有内置camelCase路径转换能力,需要分两步分别配置实际路由生成规则和Swagger文档路径生成规则,保证文档展示和实际路由完全匹配。
第一步:配置路由端camelCase路径生成
- 移除原有
LowercaseUrls = true的全小写配置 - 自定义路由参数转换器,复用系统内置的camelCase命名转换逻辑,避免手写规则出错:
using Microsoft.AspNetCore.Routing; using System.Text.Json; public class CamelCaseRouteTransformer : IOutboundParameterTransformer { public string? TransformOutbound(object? value) { return value == null ? null : JsonNamingPolicy.CamelCase.ConvertName(value.ToString()!); } }
- 注册路由时将自定义转换器加入约束映射:
builder.Services.AddRouting(opt => { opt.LowercaseUrls = false; opt.ConstraintMap["camelcase"] = typeof(CamelCaseRouteTransformer); });
- 给路由模板中的
[controller]、[action]标记添加转换器标记,以特性路由为例:
// 原模板 [HttpGet("api/[controller]/[action]")] 修改为 [HttpGet("api/[controller:camelcase]/[action:camelcase]")] public string LogMeIn(...)
如果使用全局路由模板,直接在全局模板中给对应token加上
:camelcase后缀即可,不需要逐个接口修改。
完成这一步后,应用实际生成、匹配的路由就已经是camelCase格式。
第二步:配置Swagger文档camelCase路径展示
Swashbuckle 默认会按照控制器名、方法名原生大驼峰格式生成路径,需要添加文档过滤器统一修正路径格式:
- 实现Swagger文档过滤器:
using Microsoft.OpenApi.Models; using Swashbuckle.AspNetCore.SwaggerGen; using System.Text.Json; public class CamelCasePathDocFilter : IDocumentFilter { private static readonly JsonNamingPolicy CamelCase = JsonNamingPolicy.CamelCase; public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context) { var updatedPaths = new OpenApiPaths(); foreach (var (path, pathItem) in swaggerDoc.Paths) { var segments = path.Split('/', StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < segments.Length; i++) { // 跳过带{}的路径参数段,避免修改参数名 if (segments[i].StartsWith('{') && segments[i].EndsWith('}')) continue; // 仅转换首字母大写的命名段,不影响api这类已经小写的固定路径段 if (segments[i].Length > 0 && char.IsUpper(segments[i][0])) { segments[i] = CamelCase.ConvertName(segments[i]); } } updatedPaths.Add("/" + string.Join("/", segments), pathItem); } swaggerDoc.Paths = updatedPaths; } }
- 在Swagger配置中注册过滤器:
builder.Services.AddSwaggerGen(opt => { // 保留原有Swagger配置,追加以下行 opt.DocumentFilter<CamelCasePathDocFilter>(); });
重启应用后,Swagger UI中展示的接口路径就会是预期的camelCase格式,且和实际接口路由完全一致,不会出现文档路径无法调用的问题。
内容的提问来源于stack exchange,提问作者T.S.
相关产品推荐
相关产品推荐

