.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;
    });
});
相关推荐
加号38 小时前
【C#】 串口通信技术深度解析及实现
开发语言·c#
魏杨杨9 小时前
一个程序员眼中的 AI 核心概念,讲透 LLM 、Agent 、MCP 、Skill 、RAG...
ai·.net·agent·claude code
无风听海10 小时前
C# 隐式转换深度解析
java·开发语言·c#
LateFrames10 小时前
520 - 如何说晚安 (WPF)
c#·wpf·浪漫·ui体验
魔法阵维护师11 小时前
从零开发游戏需要学习的c#模块,第十四章(保存和加载)
学习·游戏·c#
Xin_ye1008615 小时前
C# 零基础到精通教程 - 第十一章:LINQ——语言集成查询
开发语言·c#
Xin_ye1008615 小时前
C# 零基础到精通教程 - 第十章:集合与泛型——高效管理数据
开发语言·c#
魔法阵维护师17 小时前
从零开发游戏需要学习的c#模块,第十一章(rpg小游戏入门,上篇,地图与移动)
学习·游戏·c#
雪豹阿伟17 小时前
8.C# —— 随机数、DateTime时间、字符串
c#·上位机
天下无敌笨笨熊17 小时前
C#常用三方库使用心得
开发语言·c#