引用类库中的类时无法接收POST请求数据
.NET Core最小Web API引用类库模型时,FromBody反序列化嵌套对象无响应问题
问题诊断
核心原因是类库依赖Newtonsoft.Json,但Web API默认使用System.Text.Json处理请求体反序列化,两者的序列化行为/配置存在隐性冲突,导致嵌套对象反序列化过程中出现无征兆阻塞:
- 发送
{"id":"some value"}能正常返回,是因为该JSON无法匹配SomeClass结构,System.Text.Json直接创建空实例(无必填校验),端点逻辑正常执行 - 发送包含
subClassObject的JSON时,反序列化因序列化器冲突卡住,请求看似返回200,但实际未执行到返回逻辑
解决方案
方案1:统一Web API使用Newtonsoft.Json序列化
既然类库已依赖Newtonsoft.Json,直接让Web API同步使用该序列化器:
- 安装NuGet包:
Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson
- 在
Program.cs中配置:
var builder = WebApplication.CreateBuilder(args); // 添加Newtonsoft.Json支持 builder.Services.AddControllers().AddNewtonsoftJson(); var app = builder.Build(); // 其他中间件配置... app.MapPost("/endpoint", ([FromBody] SomeClass someClassObject) => { // do stuff with someClassObject return "OK"; }); app.Run();
方案2:调整类库模型兼容System.Text.Json
若不想切换序列化器,修改类库模型以适配System.Text.Json规则:
using System.Text.Json.Serialization; namespace SomeClassLibrary.Some.Arbitrary.Namespace { public class SomeClass { public SomeClass() {} [JsonPropertyName("subClassObject")] public SomeSubClass? subClassObject {get; set;} } public class SomeSubClass { public SomeSubClass() {} [JsonPropertyName("id")] public string? id {get; set;} } }
修改后清理并重建整个解决方案,确保Web API加载更新后的类库。
方案3:排查依赖版本冲突
检查解决方案内Newtonsoft.Json的版本一致性:
- 右键解决方案 → 管理NuGet程序包,确认所有项目的Newtonsoft.Json版本统一
- 若存在版本差异,调整为同一版本,避免类型加载异常
验证步骤
- 应用方案后重启Web API
- 用Postman发送嵌套结构的JSON请求,确认返回"OK"响应体
- 可在端点添加日志验证反序列化结果:
app.MapPost("/endpoint", ([FromBody] SomeClass someClassObject) => { Console.WriteLine($"Received ID: {someClassObject?.subClassObject?.id}"); return "OK"; });
内容的提问来源于stack exchange,提问作者hbarnett91
相关产品推荐
相关产品推荐

