升级至.NET 5.0后Asp.net Core Web API的POST请求失效问题
解决.NET 2.2升级到5.0后POST请求模型绑定为null的问题
升级后出现[FromBody]模型为null、空引用异常的核心原因,大多是**.NET Core 3.0+默认替换了JSON序列化器**,以及模型绑定规则的细微调整。以下是针对性的排查和解决步骤:
1. 恢复Newtonsoft.Json序列化(最直接的临时解决方案)
.NET 2.2默认使用Newtonsoft.Json,而.NET 5默认改用System.Text.Json,两者在序列化规则、容错性上有差异。如果前端未做改动,最快的解决方式是换回Newtonsoft:
- 安装NuGet包:
Microsoft.AspNetCore.Mvc.NewtonsoftJson - 在
Startup.cs的ConfigureServices中修改配置:public void ConfigureServices(IServiceCollection services) { // 替换默认的System.Text.Json为Newtonsoft.Json services.AddControllers().AddNewtonsoftJson(); }
2. 检查模型的可访问性与构造函数
System.Text.Json对模型的要求更严格:
- 确保
JobsReportSearchViewModel是public类,所有需要绑定的属性都是public且带有get/set访问器 - 如果模型只有带参数的构造函数,必须添加
[JsonConstructor]特性,或者新增一个public无参构造函数:public class JobsReportSearchViewModel { // 新增无参构造函数 public JobsReportSearchViewModel() { } public DateTime? enteredDateFrom { get; set; } // 其他属性... }
3. 验证请求头与JSON格式
- 抓包确认Content-Type:前端请求必须携带
Content-Type: application/json头,否则[FromBody]无法解析请求体。用Chrome开发者工具或Fiddler检查请求头是否符合要求 - 校验JSON格式:System.Text.Json对无效JSON的容错性远低于Newtonsoft,比如末尾逗号、未闭合的引号等,都会导致绑定失败。复制请求体到JSON校验工具检查格式正确性
4. 调整命名策略匹配前端参数
如果前端发送的参数命名(比如PascalCase)与System.Text.Json默认的驼峰策略不匹配:
- 方式一:给模型属性添加
[JsonPropertyName]特性指定对应字段名:public class JobsReportSearchViewModel { [JsonPropertyName("EnteredDateFrom")] // 匹配前端发送的字段名 public DateTime? enteredDateFrom { get; set; } } - 方式二:全局修改System.Text.Json的命名策略为PascalCase:
services.AddControllers().AddJsonOptions(options => { // 禁用驼峰命名,使用属性的原命名(PascalCase) options.JsonSerializerOptions.PropertyNamingPolicy = null; });
5. 排查路由与请求方式匹配
确认前端请求的URL完全匹配[Route("GetJobsReport")],且请求方式为POST,避免误发GET请求导致无请求体可解析
内容的提问来源于stack exchange,提问作者Robbie Mills
相关产品推荐
相关产品推荐

