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 之类的. 

 

posted @ 2021-11-05 12:33  兴杰  阅读(106)  评论(0编辑  收藏  举报