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 之类的.
相关文章
- 为ASP.NET MVC视图输出json
- ASP.NET对HTML元素进行权限控制(三)
- ASP.NET对HTML元素进行权限控制(一)
- asp.net中对于DataTable转制的通用代码(行列式转制)
- Asp.Net core 视图组件ViewComponent
- ASP.NET Core Web服务器 Kestrel和Http.sys 特性详解
- Asp.Net Core 第04局:依赖注入
- ASP.NET Core Library – HtmlSanitizer
- ASP.NET Core – HttpClient
- Asp.net core 学习笔记 Secret 和 Data Protect Azure key-vault & Storage Account 第 2 篇
- Asp.net core 学习笔记 (Excel 读写)
- Asp.net core 学习笔记 ( ef core )
- ASP.NET 加入返回参数ReturnValue
- ASP.NET Core Blazor Webassembly 之 渐进式应用(PWA)
- ASP.NET Core Razor Pages 初探
- ASP.NET Core中的Controller
- ASP.NET Core中使用GraphQL - 第六章 使用EF Core作为持久化仓储
- 使用ASP.NET Core支持GraphQL( restful 配套)
- 使用 Metrics.net + influxdb + grafana 搭建项目自动化监控和预警方案
- ASP.NET Core使用Web API通过Open XML SDK生成Word文件模板
- 学习ASP.NET Core,怎能不了解请求处理管道[2]: 服务器在管道中的“龙头”地位
- ASP.NET Core的配置(5):配置的同步[ 实例篇]
- ASP.NET Core的配置(3): 将配置绑定为对象[下篇]
- ASP.NET Core开发-获取所有注入(DI)服务
- ASP.NET Core 开发-中间件(StaticFiles)使用
- ASP.NET是如何在IIS下工作的
- 我在开发网站后得出的asp.Net网站优化总结