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
相关产品推荐
相关产品推荐

