顶级语句/Minimal API项目中Configure<JsonOptions>回调未触发
问题原因
你使用的是最小API(通过WebApplication.CreateSlimBuilder创建),而Configure<JsonOptions>是针对MVC控制器的序列化配置项,最小API默认不会读取这个配置。同时CreateSlimBuilder默认未添加MVC相关服务,导致你的回调函数根本不会被触发。另外,Results.Ok在最小API场景下会使用System.Text.Json的默认序列化规则,和JsonOptions无关。
解决方法
根据你的需求选择以下方案:
方案1:给最小API配置序列化选项(推荐)
改用ConfigureHttpJsonOptions配置最小API专用的序列化规则:
using System.Text.Json.Serialization; var builder = WebApplication.CreateSlimBuilder(args); // 配置最小API的JSON序列化选项 builder.Services.ConfigureHttpJsonOptions(options => { options.SerializerOptions.NumberHandling = JsonNumberHandling.AllowNamedFloatingPointLiterals; }); var app = builder.Build(); app.MapGet("/", () => Results.Ok(new{value=double.PositiveInfinity})); app.Run();
方案2:启用MVC服务并复用其配置
如果需要兼容MVC的JsonOptions,可以先添加MVC服务,再通过注入方式调用配置:
using System.Text.Json.Serialization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; var builder = WebApplication.CreateSlimBuilder(args); // 添加MVC服务 builder.Services.AddControllers(); // 配置MVC的JsonOptions builder.Services.Configure<JsonOptions>(options => { options.JsonSerializerOptions.NumberHandling = JsonNumberHandling.AllowNamedFloatingPointLiterals; }); var app = builder.Build(); // 注入JsonOptions并用于序列化 app.MapGet("/", (IOptions<JsonOptions> jsonOptions) => Results.Json(new{value=double.PositiveInfinity}, options: jsonOptions.Value.JsonSerializerOptions)); app.Run();
验证
运行项目后访问/,应该能正常返回{"value":Infinity},不会因序列化PositiveInfinity抛出异常。
内容的提问来源于stack exchange,提问作者Damien Sawyer
相关产品推荐
相关产品推荐

