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

顶级语句/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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 00:45:05