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

ASP.NET Core Web API接收多对象畸形JSON未拒绝,仅处理首个对象问题

解决ASP.NET Core Web API接收多个JSON对象时的静默处理问题

问题场景

开发的ASP.NET Core Web API端点仅允许接收单个Todo类型对象,但出现以下异常行为:

  • 发送单个Todo对象{ obj1 },返回HTTP 200(符合预期)
  • 发送Todo对象数组[ { obj1 }, { obj2 } ],返回HTTP 400(符合预期)
  • 发送多个独立JSON对象{ obj1 }, { obj2 },API仅静默处理首个对象,忽略后续内容(不符合预期)

根因分析

当前API使用Newtonsoft JSON.NET作为JSON序列化库(通过服务配置中的AddNewtonsoftJson()启用),其默认配置允许解析多个顶级JSON对象——反序列化器会读取第一个有效对象,直接忽略后续内容,不会判定为无效JSON请求。

API端点核心代码如下:

[HttpPost]
[Route("")]
public async Task<IActionResult> CreateTodoAsync(
    [FromRoute] Guid accountId,
    [FromBody] TodoRequestDto request
)
{
    // 调用创建todo的业务逻辑
}

解决方案

要强制API仅接受单个顶级JSON对象,只需修改Newtonsoft JSON的配置,禁用多内容解析功能:

步骤1:修改服务配置

在Program.cs(或旧版本的Startup.cs)中,调整AddNewtonsoftJson的配置项,将SerializerSettings.MultipleContent设为false:

builder.Services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        // 禁用多内容JSON解析,确保仅单个顶级对象被接受
        options.SerializerSettings.MultipleContent = false;
    });

步骤2:验证效果

配置完成后,再发送多个独立JSON对象时,API会直接返回HTTP 400(Bad Request)响应,符合预期的无效请求判定逻辑。

补充说明

  • MultipleContent默认值为true,这是Newtonsoft JSON为兼容历史场景(如JSON流)保留的特性
  • 禁用该选项后,反序列化器检测到多个顶级JSON对象时会抛出JsonReaderException,ASP.NET Core会自动将其转换为标准的HTTP 400错误响应

内容的提问来源于stack exchange,提问作者Sumrender Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 19:18:17