zoukankan      html  css  js  c++  java
  • 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 之类的. 

  • 相关阅读:
    java 键盘监听事件
    DOM扩展
    DOM
    CSS hack
    客户端检测
    BOM
    函数表达式
    面向对象的程序设计
    引用类型(下)
    引用类型(上)
  • 原文地址:https://www.cnblogs.com/keatkeat/p/15512673.html
Copyright © 2011-2022 走看看