ASP.NET Core – Web API 冷知识
Under/Over Posting
参考:
.NET Core WebApi Action is executed even with missing properties in the request body
Model Validation in ASP.NET Web API (找 under-posting)
Model validation in ASP.NET Core MVC and Razor Pages
Input Validation vs. Model Validation in ASP.NET MVC
什么是 under/over-posting?
假设一个 Post 请求需要一个 ProductDTO, 里面有 Name, Price 2 个属性
public class ProductDTO { public string Name { get; set; } = ""; public decimal Price { get; set; } }
Client 在发请求时, 给了一个空对象. 这种情况就叫 under-posting (给的 property 不够), 如果给了一些额外的 property 那就叫 over-posting (给多了)
默认情况下, ASP.NET Core 遇到 under-posting, 它会给 default value. 跟 new Class() 一样.
当遇到 over-posting 的时候, 多的 property 会被 ignore, 最后的 instance 自然不会有多余的 property.
Ignore over-posting 通常是 ok 的, 但是 default value for under-posting 有时候会反直觉.
比如有一个必填的 enum, 我们会想加一个 [Required] or NotEmpty(), 但是由于有 default value 机制. 它会自动填入 enum first value.
以至于, [Required] 肯定通过, 而 NotEmpty() 则不允许是 default value (意味着用户即便真的想选 enum first value 也会被误以为是 default value)
所以最终就是根本不需要写 required validation 就对了. int = 0, bool = false 也是同样的情况.
如果不希望这种情况诞生, ASP.NET Core 给出的 idea 是 set the property to nullable, 这样就不会有 default value 了.
当然 nullable 对后续的调用是否友好是另一个问题. 我个人比较喜欢 default value + 不写 required validation 机制的.
因为 under-posting 本来就是 front-end mistake 引发的问题 (没有读 API 文档吗? 那还要我写?). under-posting 并不会导致 hacking 问题. 因为 default value 是否可以过 (比如 int = 0)
会有其它的 validation 去验证, 比如 int value > 0 之类的.