前言

相信大家都或多或少用上了Minimal API,快速简洁,性能炸裂,是快速开发API端口的不二之选!但是呢目前正式版为止 最小API还并不内置支持对请求参数的内置验证支持,比如[Required],或者任何需要验证的地方,往往我们要实现这样的逻辑都必须自主扩展一个EndpointFilter,这个在NET社区也算是一个不大不小的槽点,不过呢MS总算是千呼万唤始出来,在NET10的第三个预览版提供了对System.ComponentModel.DataAnnotations内置验证支持!

体验

安装升级到最新释出的NET10Preview3,然后完成下面操作:

builder.Services.AddValidation();

在项目文件(.csproj)中配置 InterceptorsNamespaces 属性以启用自动生成的拦截器。示例配置如下:

<PropertyGroup>
<!-- 启用验证属性拦截器的生成 -->
<InterceptorsNamespaces>$(InterceptorsNamespaces);Microsoft.AspNetCore.Http.Validation.Generated</InterceptorsNamespaces>
</PropertyGroup>

然后源生成器就可以工作了,会自动发现验证类型 实现机制会自动查找在最小 API 处理程序中定义的类型或其基类型中所配置的验证属性,并在每个终端节点上通过添加的终端节点筛选条件执行验证。这种方式大大简化了开发者的工作量,无需手动编写验证逻辑。

比如下面的API定义:

app.MapPost("/products",
([EvenNumber(ErrorMessage = "产品ID必须")] int productId, [Required] string name)
=> TypedResults.Ok(productId))

如果产品ID未传,或者name为空那么将会返回 HTTP 400 Bad Request的错误!

如果需要排除这个Endpoint的参数验证只需要添加上.DisableValidation()即可:

app.MapPost("/products",
([EvenNumber(ErrorMessage = "产品ID必须")] int productId) => TypedResults.Ok(productId))
.DisableValidation();

当然了除了内置于System.ComponentModel.DataAnnotations的验证特性之外,你完全可以扩展自己的验证特性,比如和业务相关的复杂验证情况,只需要实现IValidatableObject接口即可,也可以继承自ValidationAttribute实现一些简单的个性化验证

最后

验证支持机制使 MinimalAPI 能够在请求数据进入业务逻辑之前自动执行验证,从而提高安全性和代码维护性。同时,开发者既可以利用内置的验证功能,也可以通过自定义验证属性和接口实现来满足特定业务需求。通过这种灵活的设计,ASP.NET Core 的MinimalAPI能够在保持简洁的同时,提供强大而可靠的验证支持。

当前还属于早期预览版本,可能后续正式版本的发布还会有些许变化,前期了解即可,待正式发布再用于生产~

我们一起期待正式版的早日到来!

Aspnet Core 10 Preview3已对最小API提供参数验证支持的更多相关文章

  1. 为 ASP.NET Core (6.0)服务应用添加ApiKey验证支持

    这个代码段演示了如何为一个ASP.NET Core项目中添加Apikey验证支持. 首先,通过下面的代码创建项目 dotnet new webapi -minimal -o yourwebapi 然后 ...

  2. 从 MVC 到使用 ASP.NET Core 6.0 的最小 API

    从 MVC 到使用 ASP.NET Core 6.0 的最小 API https://benfoster.io/blog/mvc-to-minimal-apis-aspnet-6/ 2007 年,随着 ...

  3. AspNet Core Api Restful +Swagger 发布IIS 实现微服务之旅 (二)

    上一步我们创建好CoreApi 接下来在框架中加入 Swagger  并发布  到 IIS (1)首先点击依赖项>管理Nuget包 (2)输入 Swashbuckle.aspnetCore  比 ...

  4. AspNet Core Api Restful +Swagger 实现微服务之旅 (三)

    (1)  访问Rest ful接口时 Token验证  返回数据格式封装 (一)访问时Token验证  返回数据格式封装 1.1访问Api接口 方法 实现         1.1.1 创建访问Rest ...

  5. AspNet Core Api Restful +Swagger 发布IIS

    上一步我们创建好CoreApi 接下来在框架中加入 Swagger  并发布  到 IIS (1)首先点击依赖项>管理Nuget包 (2)输入 Swashbuckle.aspnetCore  比 ...

  6. AspNet Core Api Restful 实现微服务之旅 (一)

    (一)了解微服务(二)搭建VS项目框架  (三)创建AspNet Core Api VS2017 安装包   链接:https://pan.baidu.com/s/1hsjGuJq 密码:ug59 创 ...

  7. 设计模式(一)单例模式:创建模式 ASPNET CORE WEB 应用程序的启动 当项目中 没有STARTUP.CS 类如何设置启动 配置等等

    设计模式(一)单例模式:创建模式 先聊一下关于设计的几个原则(1)单一原则(SRP):一个类应该仅有一个引起它变化的原因 :意思就是 (一个类,最好只负责一件事情,并且只有一个引起它变化的原因(2)开 ...

  8. ASP.NET Core 中文文档 第二章 指南(2)用 Visual Studio 和 ASP.NET Core MVC 创建首个 Web API

    原文:Building Your First Web API with ASP.NET Core MVC and Visual Studio 作者:Mike Wasson 和 Rick Anderso ...

  9. 【AspNet Core】Nuget代理网站

    因为访问Nuget太慢,在Dotnet Core RC2发布前,我就基于Asp.Net做了一个Nuget代理网站 这是网站地址:http://nuget.lzzy.net/ Nuget源:http:/ ...

  10. 【翻译】在Visual Studio中使用Asp.Net Core MVC创建第一个Web Api应用(二)

    运行应用 In Visual Studio, press CTRL+F5 to launch the app. Visual Studio launches a browser and navigat ...

随机推荐

  1. Java并发容器详解,及使用场景

    并发容器的由来 在Java并发编程中,经常听到Java集合类,同步容器.并发容器,那么他们有哪些具体分类,以及各自之间的区别和优劣呢? 只有把这些梳理清楚了,你才能真正掌握在高并发的环境下,正确使用好 ...

  2. 【python】如何优雅的终止while循环

    1. 背景需求 python需要与外界或终端交互时,常常需要使用while循环一直跑. 如果需要终止程序,一般使用Ctrl+c,此时终端会打印一大堆backtrace,并且无法保留当前运行的状态,非常 ...

  3. druid 连接池参数说明

    一.参数配置说明 属性 说明 建议值 url 数据库的jdbc连接地址.一般为连接oracle/mysql.示例如下:     mysql : jdbc:mysql://ip:port/dbname? ...

  4. Vue 页面批量导入其他组件

    <template> <div> <template v-for="(item) in names"> <component :is=&q ...

  5. Flink学习(五) Flink 的核心语义和架构模型

    Flink 的核心语义和架构模型我们在讲解 Flink 程序的编程模型之前,先来了解一下 Flink 中的 Streams.State.Time 等核心概念和基础语义,以及 Flink 提供的不同层级 ...

  6. 记一次Microsoft.Toolkit.Mvvm(MVVM Toolkit)的兼容性问题

    今天在目标框架为framework4.6.1的wpf项目中使用Microsoft.Toolkit.Mvvm7.1.1出现了一个比较怪异的编译时错误,前提是打开了 工具>选项>环境>预 ...

  7. OpenOffice已停更六年 文档基金会呼吁用户迁移LibreOffice

    OpenOffice 源代码发布至今已经有 20 年了.文档基金会近日发布公开信,表示说:"LibreOffice 是 OpenOffice 的未来.我们将会全力以赴".以此呼吁那 ...

  8. vue3用vite新建项目

    1. npm init vue@latest vue3-project 调用create-app创建, 指定了目录是vue3-projece,但是,紧接着有一堆配置要询问. 2. npm create ...

  9. 【多进程并发笔记】Python-Multiprocess

    目录 调用函数后,函数内的变量如何释放? python2.7怎么使用多线程加速for loop 多进程进程池,函数序列化错误的处理 Time模块计算程序运行时间 使用多进程,Start()后,如何获得 ...

  10. Matlab转python的索引问题

    python 中numpy库可以实现类似matlab多维数组的运算.但两者在索引方式上存在一些差异.这是需要注意的.例如: % 定义一个4*4矩阵 A=1:16; A=reshape(A,[4,4]) ...