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

如何配置使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路径生成

  1. 移除原有LowercaseUrls = true的全小写配置
  2. 自定义路由参数转换器,复用系统内置的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()!);
    }
}
  1. 注册路由时将自定义转换器加入约束映射:
builder.Services.AddRouting(opt =>
{
    opt.LowercaseUrls = false;
    opt.ConstraintMap["camelcase"] = typeof(CamelCaseRouteTransformer);
});
  1. 给路由模板中的[controller]、[action]标记添加转换器标记,以特性路由为例:
// 原模板 [HttpGet("api/[controller]/[action]")] 修改为
[HttpGet("api/[controller:camelcase]/[action:camelcase]")]
public string LogMeIn(...)

如果使用全局路由模板,直接在全局模板中给对应token加上:camelcase后缀即可,不需要逐个接口修改。
完成这一步后,应用实际生成、匹配的路由就已经是camelCase格式。

第二步:配置Swagger文档camelCase路径展示

Swashbuckle 默认会按照控制器名、方法名原生大驼峰格式生成路径,需要添加文档过滤器统一修正路径格式:

  1. 实现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;
    }
}
  1. 在Swagger配置中注册过滤器:
builder.Services.AddSwaggerGen(opt =>
{
    // 保留原有Swagger配置,追加以下行
    opt.DocumentFilter<CamelCasePathDocFilter>();
});

重启应用后,Swagger UI中展示的接口路径就会是预期的camelCase格式,且和实际接口路由完全一致,不会出现文档路径无法调用的问题。


内容的提问来源于stack exchange,提问作者T.S.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 21:48:10