如何将.NET Web API中OData API的路径默认设置为小写格式?
解决OData端点在Swagger中显示小写路径的方案
核心配置步骤
1. 开启全局路由小写配置
在ASP.NET Core的服务注册阶段,先开启系统路由的全局小写规则,该规则会作用于包括OData在内的所有路由:
builder.Services.Configure<RouteOptions>(options => { options.LowercaseUrls = true; // 可选配置:查询参数也统一为小写 options.LowercaseQueryStrings = true; });
2. 配置OData EDM模型使用小写实体集名
Swagger中显示的OData端点路径直接由EDM模型中定义的实体集名称决定,构建模型时将实体集名称设为小写即可:
单实体手动配置:
var modelBuilder = new ODataConventionModelBuilder(); // 直接指定小写的实体集名称 modelBuilder.EntitySet<你的实体类>("你的小写实体集名");
批量自动配置所有实体集为小写:
如果实体数量多,可以遍历自动生成小写实体集名称,不用逐个手动配置:
foreach (var structuralType in modelBuilder.StructuralTypes) { if (structuralType is EntityTypeConfiguration entityConfig) { // 可根据自己的命名规则调整,例如类名小写加复数后缀 string lowerEntitySetName = entityConfig.ClrType.Name.ToLowerInvariant() + "s"; modelBuilder.AddEntitySet(lowerEntitySetName, entityConfig); } }
3. 完整OData服务注册示例(.NET 6+ / OData 8.x版本)
builder.Services.AddControllers() .AddOData(options => { var modelBuilder = new ODataConventionModelBuilder(); // 上面的EDM模型配置写在这里 var edmModel = modelBuilder.GetEdmModel(); // 开启你需要的OData查询能力,因为你只用GET查询,按需开启即可 options.Select().Filter().OrderBy().Expand().Count().SetMaxTop(100) .AddRouteComponents("odata", edmModel); }); // 要正确生成OData端点的Swagger文档,需要安装NuGet包:Swashbuckle.AspNetCore.SwaggerGen.OData builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen();
旧版本适配(OData 7.x)
如果使用的是OData 7.x版本,添加如下配置即可:
public static void Register(HttpConfiguration config) { // 开启小写驼峰命名规则 config.EnableLowerCamelCase(); // 构建EDM时同样指定小写实体集名 var builder = new ODataConventionModelBuilder(); builder.EntitySet<你的实体类>("你的小写实体集名"); // 注册OData路由 config.MapODataServiceRoute( routeName: "ODataRoute", routePrefix: "odata", model: builder.GetEdmModel()); }
注意事项
- 如果你在OData Controller上手动加了
[Route]属性,需要确保路由模板为小写,手动配置的优先级高于全局规则 - 配置完成后清理Swagger缓存或浏览器缓存,避免旧的大写路径残留
- 配置完成后Swagger中显示的路径会和实际可访问的小写路径完全一致,不会再出现大小写不匹配的问题
内容的提问来源于stack exchange,提问作者Nathan van Jole
相关产品推荐
相关产品推荐

