.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;
    });
});
相关推荐
IT规划师5 小时前
MQTT实战 - 用了8年MQTT,我为什么还要重新系统啃一遍(一)
物联网·.net
邹肖桥11 小时前
使用S7.net动态库对西门子Plc S7-1200进行通讯操作
.net
samble11 小时前
从零搭建灌装监控系统(十八):自定义控件,三色灯与状态指示
c#·wpf·mvvm·modbus·工业控制
jun_bai11 小时前
使用Aspose实现word文档合并,内容替换
windows·c#·word
字节暗面15 小时前
客户端上报不可信:游戏服务端数据校验与对局重演设计
c#·游戏开发·服务端校验·反作弊
chingho16 小时前
GitHub上这10个C#项目,不仅实用,还怪好玩的
c#·github·.net·开源项目
学以智用17 小时前
Visual Studio 模板详解
.net
半亩码田17 小时前
C#转Python第5.1篇:异步编程:asyncio vs async/await,语法相似但机制不同
开发语言·python·c#
阿华田51218 小时前
Java 类加载冲突实战:解决 is not an instance of
c#·linq
samble1 天前
从零搭建灌装监控系统(十七):LiveCharts 实时温度曲线
c#·wpf·mvvm·modbus·工业控制