我正在开发一个支持OpenApi的.NET Core6中的最小API.

我有一个如下定义的解析模型:

using System.ComponentModel.DataAnnotations;

public struct Resolution
{
    [Required, Range(1, 800)]
    public int W { get; set; }

    [Required, Range(1, 600)]
    public int H { get; set; }
}

然后,我有一个如下所示的POST端点定义:

app.MapPut("/resolutions", (Resolution res) =>
{
    //Some logic here
    return Results.Ok(new { Message = "Resource updated successfully" });
})
.Produces(200)
.Produces(404)
.WithName("PutResolution");

case 1.我发送了一个PUT请求(超出范围值FORW):

"resolution": {
    "w": 1024,
    "h": 400
}

结果:200例正常.

case 2:我发送了一个PUT请求(w的数据类型错误):

"resolution": {
    "w": "xl",
    "h": 400
}

结果:400个JsonException

发行:

  • 依赖于反序列化的JsonException.优选地,应该向消费者返回模式验证错误.

问题:

  1. 在这种情况下处理验证的最佳实践是什么?
  2. 有没有办法根据OpenApi协定验证传入的请求,在本例中,该协定是动态生成的?在这种情况下,数据类型错误和值超出范围的问题都将在进入路由处理程序之前进行验证.

推荐答案

正如在这个document中提到的,在.NET6最小API中没有内置的验证支持.

如果你真的想要它,你可以try 第三方解决方案,如这blog.

Csharp相关问答推荐

单元测试和MOQ,最佳解决方案

如果第一个匹配项为空,则规则运算不会拆分C#中分离字符串上的子菜单

Blazor:计算值或保留为默认值

我可以 suppress 规则CS 9035一次吗?

获取ASP.NET核心身份认证cookie名称

MongoDB将JS查询转换为C#的问题

将委托传递到serviceccollection c#web API

应该使用哪一个?"_counter += 1 OR互锁增量(ref_counter)"""

. NET在上一个操作完成之前,在此上下文实例上启动了第二个操作

Microsoft. VisualBasic. FileIO. FileSystem. MoveFile()对话框有错误?

如何在NodaTime中为Instant添加一年?

不带身份的Blazor服务器.Net 8 Cookie身份验证

在此系统上已禁用获取正在运行的脚本.&在ASP.NET Core Web API中

共享暂存/生产环境中Azure事件中心的建议配置

在EF Core中,有没有什么方法可以防止在查询中写入相同的条件,而代之以表达式?

在C#中,将两个哈希集连接在一起的时间复杂度是多少?

在字符串C#之前获取数字

Regex字母数字校验

为值对象编写自定义JsonConverter

Visual Studio 17.8.0制表符自动完成问题--三缩进