.NET 10 & C# 14 New Features 新增功能介绍-ASP.NET Core

在以前的版本中,Minimal API 默认不会自动执行 DataAnnotations 验证,通常需要:

  • 手动调用 Validator

  • 使用 FluentValidation

  • 或写 Middleware / Filter

而在 .NET 10 中,Minimal API 可以自动执行模型验证,和 MVC Controller 的行为一致。

使用 DataAnnotations注解:

复制代码
public class UserDto
{
    [Required]
    public string Name { get; set; }

    [Range(1,120)]
    public int Age { get; set; }
}

Minimal API:

复制代码
app.MapPost("/users", (UserDto dto) =>
{
    return Results.Ok(dto);
});

如果请求:

{

"age": 200

}

系统会 自动返回 400:

复制代码
{
  "type": "https://tools.ietf.org/html/rfc9110#section-15.5.1",
  "title": "One or more validation errors occurred.",
  "errors": {
    "Name": ["The Name field is required."],
    "Age": ["The field Age must be between 1 and 120."]
  }
}

这个自动校验的触发机制是这样的

ASP.NET Core 会在 Endpoint Binding 阶段执行:

  1. Request Body → Model Binding

  2. DataAnnotations Validation

  3. 如果失败 → 自动返回 400 ValidationProblem

  4. 如果成功 → 进入 Handler

二、新增了对 Server-Sent Events(SSE) 的原生支持

在 ASP.NET Core 的 .NET 10 中,新增了对 Server-Sent Events(SSE) 的原生支持,可以通过

TypedResults.ServerSentEvents 直接返回 实时数据流。

这让 Minimal API 实现实时推送变得非常简单,无需使用 WebSocket 或 SignalR。

一行代码搞定

TypedResults.ServerSentEvents()

自动:

  • 设置 Content-Type

  • 处理数据流格式

  • 处理 Flush

示例代码

复制代码
app.MapGet("/time", () =>
{
    async IAsyncEnumerable<string> GetTimeStream()
    {
        while (true)
        {
            yield return DateTime.Now.ToString("HH:mm:ss");
            await Task.Delay(1000);
        }
    }

    return TypedResults.ServerSentEvents(GetTimeStream());
});

前端JS代码

const source = new EventSource("/time");

source.onmessage = (event) => {

console.log("Server time:", event.data);

};

同时,.NET 10 支持 Typed SSE Event:

复制代码
app.MapGet("/events", () =>
{
    async IAsyncEnumerable<SseItem<string>> Stream()
    {
        while (true)
        {
            yield return new SseItem<string>(
                DateTime.Now.ToString(),
                eventType: "time"
            );

            await Task.Delay(1000);
        }
    }

    return TypedResults.ServerSentEvents(Stream());
});

三、OpenAPI 3.1支持

OpenAPI Specification 是 REST API 的行业标准规范。

OpenAPI 3.1 的核心变化:

MiniAPI代码示例

复制代码
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddOpenApi();

var app = builder.Build();

app.MapGet("/stations", () =>
{
    return new[]
    {
        new { Id = 1, Name = "Station A" },
        new { Id = 2, Name = "Station B" }
    };
});

app.MapOpenApi();

app.Run();

访问:/openapi/v1.json

返回得到 OpenAPI 3.1 文档。

同时YAML也得到了支持

在 API 管理和云平台中,很多工具更喜欢 YAML 格式。

/openapi/v1.yaml

示例返回

复制代码
openapi: 3.1.0
info:
  title: Charging API
  version: 1.0.0
paths:
  /stations:
    get:
      responses:
        "200":
          description: OK

启用YAML输出

复制代码
builder.Services.AddOpenApi(options =>
{
    options.AddDocumentTransformer((doc, ctx, ct) =>
    {
        doc.Info.Title = "Charging Platform API";
        return Task.CompletedTask;
    });
});
相关推荐
暴走约伯27 分钟前
【VFX工具链源码拆解 04】拯救丢失的绑定:Timeline 一键克隆与层级相对路径重映射算法
unity·c#·游戏引擎·硬件工程
1-1=036 分钟前
C# 反射
c#·.net·.netcore
一叶星殇1 小时前
版本即契约:.NET 6 WebAPI 多版本治理与 Swagger 文档分治实践
mvc·.net
Jeff-Tsai2 小时前
Day 9:数据与定义分家,表单不必各自建类型
.net·架构设计·erp·definition-driven
步步为营DotNet2 小时前
.NET 可观测性选型:Metrics、ActivitySource、EventSource 到底该用哪个
c#·.net·metrics·可观测性
CSharp精选营2 小时前
我把 Ant Design Blazor 翻了一遍:Blazor 中后台组件库到底能不能用
.net·blazor·ant design blazor·中后台系统·mudblazor
IT规划师3 小时前
Redis 数据类型全解 - ZSet:两个编码,七种玩法(五)
redis·.net
吃一碗粉只付一碗钱13 小时前
16-SqlSugar多库ConfigId与按实体选连接
sqlserver·c#
rockey62714 小时前
AScript之字符串模板
c#·.net·script·expression·动态脚本
will_net15 小时前
Redis集群部署+Redis 链接地址放入Aollo +c#项目接入Redis
redis·c#·bootstrap