.NET 3.1升级至7.0后出现Error 400 Bad Request请求错误
解决.NET 7.0升级后接口400 Bad Request(空值对象不被接受)问题
问题原因
从.NET 3.1升级到.NET 7.0后,ASP.NET Core的默认模型验证规则发生变化——默认会拒绝包含空值的请求对象,而.NET 3.1中默认允许此类情况,这直接导致调用接口时返回400错误。
解决方案
可以通过以下几种方式处理:
1. 全局配置允许空值对象验证
在Program.cs中修改服务配置,调整模型验证的默认行为:
builder.Services.AddControllers() .AddJsonOptions(options => { // 使用System.Text.Json时,允许序列化空值 options.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.Never; }) .AddMvcOptions(options => { // 关闭对非可空引用类型的隐式必填验证 options.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes = true; });
若项目仍使用Newtonsoft.Json(Json.NET),需单独配置:
builder.Services.AddControllers() .AddNewtonsoftJson(options => { options.SerializerSettings.NullValueHandling = NullValueHandling.Include; });
2. 客户端序列化时排除空值字段
修改客户端序列化逻辑,将空值字段从请求体中移除,避免触发服务端验证:
// 调整JsonConvert序列化配置,排除空值字段 StringContent content = new StringContent( JsonConvert.SerializeObject(loginObj, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }), Encoding.UTF8, "application/json");
3. 针对特定模型或字段调整验证规则
如果不想全局修改,可以在模型的空值字段上添加特性:
- 使用System.Text.Json时:
public class Login { public string Username { get; set; } [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public string? Nickname { get; set; } }
- 使用Newtonsoft.Json时:
public class Login { public string Username { get; set; } [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] public string Nickname { get; set; } }
额外优化建议
- 无需手动调用
httpClient.Dispose()和response.Dispose(),using声明会自动释放资源,重复调用可能引发问题。 - 建议通过
IHttpClientFactory注册HttpClient为单例,避免频繁创建销毁实例导致的Socket资源耗尽问题。
内容的提问来源于stack exchange,提问作者mado HK
相关产品推荐
相关产品推荐

