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

C# Web API输入属性名验证疑问:传错属性名仍正常运行

问题描述

我有一个Web API端点,接收rollNo路径参数和Subject类型的请求体数据。用Postman测试时,即使传入错误的属性名,API依然能正常运行,我对此感到困惑。

API端点代码:

public async Task<ActionResult<IEnumerable<Emp>>> GetStudentMarks(long rollNo, [FromBody] Subject subs)
{
    //do stuff
}

Subject类定义:

public class Subject
{
    /// <summary>
    /// Array of subject names
    /// </summary>
    [Required]
    public string[] SubjectNames { get; set; }

    /// <summary>
    /// Include Last Semester Marks or not
    /// </summary>
    [Required]
    public bool? IncludeLastSemesterMarks { get; set; }
}

本地测试URL:

https://localhost:7120/v1/API/getstudentmarks/1234

请求体内容(LastSemesterMarks为错误属性名,正确应为IncludeLastSemesterMarks):

{
  "SubjectNames": ["English", "History"],
  "LastSemesterMarks": true
}
原因分析
  • JSON序列化器忽略未匹配字段:ASP.NET Core默认使用的System.Text.Json(或旧版Newtonsoft.Json)在反序列化时,会自动跳过请求体中不存在于目标类的属性。LastSemesterMarks这个错误字段会被直接忽略,不会干扰反序列化流程。
  • 必填属性验证未触发报错:你给IncludeLastSemesterMarks标记了[Required],但错误字段没匹配到该属性,导致它的值为null。如果API业务逻辑里没有严格校验这个null值,或者没启用模型验证机制,就不会因为必填字段缺失而报错。
  • 模型验证未启用:如果控制器没有添加[ApiController]特性,或者项目未在启动配置中启用模型验证中间件,[Required]特性的校验逻辑不会自动执行,API会继续运行而不返回验证错误。

内容的提问来源于stack exchange,提问作者learningdotnet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 08:10:17