.NET Core 2.2迁移至3.0后Controller Post接口[FromBody]参数为Null问题
解决.NET Core 3.0迁移后[FromBody]数组参数为Null的问题
我来帮你分析下这个问题,你把项目从.NET Core 2.2迁到3.0后,其他带[FromBody]的接口正常,唯独MainController的GetProcess方法接收数组参数时始终为null,主要有两个核心原因,咱们一步步来解决:
1. 默认序列化器变更导致特性失效
.NET Core 3.0开始,MVC默认用System.Text.Json替代了之前的Newtonsoft.Json(Json.NET)。而你的模型里用的[JsonProperty]是Newtonsoft专属的特性,System.Text.Json根本不认识它——这会导致字段映射失败,严重的话直接让整个反序列化过程出错,最终参数就变成null了。
解决这个问题有两种选择:
- 方案一:改用System.Text.Json的特性
把模型里的[JsonProperty]全部替换成[JsonPropertyName],记得先引用System.Text.Json.Serialization命名空间:using System.Text.Json.Serialization; public class ProcessModel { [JsonPropertyName("Name")] public string Name { get; set; } [JsonPropertyName("ExeName")] public string ExeName { get; set; } [JsonPropertyName("Path")] public string Path { get; set; } // 其他字段同理替换,重点注意下面的Args字段 [JsonPropertyName("Args")] public string[] Args { get; set; } // ... 剩余字段省略 } - 方案二:换回熟悉的Newtonsoft.Json
如果你还是习惯用Newtonsoft,也可以通过NuGet安装Microsoft.AspNetCore.Mvc.NewtonsoftJson包,然后在ConfigureServices里重新配置:
这样你原来的services.AddControllers().AddNewtonsoftJson();[JsonProperty]特性就能正常工作了。
2. 请求JSON的Args字段类型不匹配
看你提供的请求JSON,Args的值是{"IsFile": false}——这是一个JSON对象,但你的模型里Args定义的是string[](字符串数组)。类型完全不匹配,直接会导致反序列化失败,这也是参数为null的关键诱因。
你需要根据实际需求调整:
- 如果确实要传数组:把请求里的
Args改成字符串数组格式,比如:"Args": ["IsFile=false"] - 如果要传对象:那得修改模型里的
Args类型,比如先定义一个对应类:public class ArgsConfig { public bool IsFile { get; set; } } // 然后在ProcessModel里更新: [JsonPropertyName("Args")] // 用Newtonsoft的话就用[JsonProperty] public ArgsConfig Args { get; set; }
额外验证小技巧
做完上面的修改后,要是还不确定问题在哪,可以临时改一下控制器方法,先读取原始请求体,手动反序列化看具体错误:
[HttpPost] [Route("Process")] public async Task<IActionResult> GetProcess() { var rawBody = await new StreamReader(Request.Body).ReadToEndAsync(); try { // 用System.Text.Json尝试反序列化 var processes = System.Text.Json.JsonSerializer.Deserialize<ProcessModel[]>(rawBody); // 用Newtonsoft的话就用JsonConvert.DeserializeObject<ProcessModel[]>(rawBody); } catch (Exception ex) { // 这里的异常信息会告诉你具体哪错了,比如字段不匹配、类型不对 return BadRequest($"反序列化失败:{ex.Message}"); } // ... 后续逻辑 }
这样就能精准定位问题了。
内容的提问来源于stack exchange,提问作者ATT
相关产品推荐
相关产品推荐

