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
相关产品推荐
相关产品推荐

