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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 06:52:36