.NET 6 Minimal API:Results.OK为何忽略全局JSON命名策略?
我正在使用Minimal API重构一个旧REST服务,需要尽可能复刻原服务的功能。原服务返回的数据采用Pascal case命名,且存在对大小写敏感的旧客户端。.NET 6 Web默认采用camel case序列化,但可通过以下代码覆盖该行为:
builder.Services.Configure<JsonOptions>(options => { options.JsonSerializerOptions.PropertyNamingPolicy = null; });
设置断点后可见,该策略最初为camel case,随后被重置为null。使用JsonSerializer.Serialize时表现符合预期,但使用Results.Ok(collection)返回数据时又变回camel case,仿佛忽略了配置的选项。通过在模型类上声明特性设置属性名称可正常生效,但服务级配置无效。请问Results.Ok的响应管道采用的是哪套配置?
Results.Ok(以及Minimal API中其他Results系列方法)使用的是**Microsoft.AspNetCore.Http.Json.JsonOptions**,而非你之前配置的通用System.Text.Json.JsonOptions,这就是服务级配置失效的核心原因。
要让Results.Ok输出Pascal case格式的数据,需要修改配置目标为HTTP响应专用的JsonOptions,代码如下:
builder.Services.Configure<Microsoft.AspNetCore.Http.Json.JsonOptions>(options => { options.SerializerOptions.PropertyNamingPolicy = null; });
补充说明
Minimal API的Results方法是专为HTTP响应场景设计的,它依赖ASP.NET Core单独维护的HTTP序列化配置体系,这套配置和通用JsonOptions相互独立。将PropertyNamingPolicy设为null后,序列化逻辑会直接使用模型属性的原始名称(即Pascal case),与旧服务的输出格式完全匹配。
内容的提问来源于stack exchange,提问作者misterscratch

