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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:05:43