.NET 11 来了:Kestrel 提速 40%,还有这些你可能不知道的变化

发布日期:2026-05-14 | 来源:Microsoft Learn

.NET 11 的 ASP.NET Core 更新没有那种"推倒重来"式的大 feature,但有一批实打实的改进:Blazor 的虚拟化重写了、Kestrel 吞吐量提了 20-40%、OpenAPI 升到 3.2、还顺带把 MCP 服务器模板直接塞进了 SDK。下面按模块梳理。

一、Blazor

DisplayName 组件

以前要在表格里显示"生产日期"而不是 ProductionDate,得手动处理。现在直接声明式绑定:

ini 复制代码
 <DisplayName For="@(() => Model!.ProductionDate)" />

​[Display]​ 属性的优先级高于 [DisplayName],而且支持本地化。

Blazor.start() 统一格式

脚本启动的选项格式现在统一了,Blazor Server 和 WebAssembly 都用同一套嵌套结构:

css 复制代码
 Blazor.start({
   webAssembly: {
     loadBootResource: function (...) { ... }
   }
 });

BasePath 组件

自动生成 <base href>​ 标签,不用再手写到 _Host.cshtml 里了。

NavMenu 不再内嵌 JS

内联 JavaScript 被移除,改用并置 JS 模块------这对 Content Security Policy(CSP)友好很多。

相对导航

​NavigateTo​ 和 NavLink​ 现在可以传 RelativeToCurrentUri = true,不用每次都拼完整路径:

ini 复制代码
 Navigation.NavigateTo("/configuration", new NavigationOptions { RelativeToCurrentUri = true });
ini 复制代码
 <NavLink href="configuration" RelativeToCurrentUri="true">Configuration</NavLink>

TempData 支持静态 SSR

静态服务端渲染下也能跨请求传递临时数据了,用 [SupplyParameterFromTempData]​ 属性或级联的 ITempData。

Blazor Web Worker 模板

​dotnet new blazorwebworker 创建一个新项目模板,把计算密集任务丢到 Web Worker 里跑,避免阻塞 UI 线程。

虚拟化重写

​Virtualize​ 组件不再假设所有项等高,会自动适应不同高度。OverscanCount​ 默认值从 3 改成了 15(减少空白闪烁)。新增 AnchorMode​ 参数:None​、Beginning​、End。

新开发服务器

独立的 Blazor WebAssembly 应用现在用 Microsoft.AspNetCore.Components.Gateway 替代旧 DevServer。

服务器触发的电路暂停

服务器可以主动让客户端暂停 Blazor Server 电路------用于计划内维护,避免粗暴断连。

二、最小 API

终结点筛选器可观察参数绑定失败

以前参数绑定失败就直接抛异常,现在筛选器管道仍然会走。筛选器里检查 HttpContext.Response.StatusCode == 400,可以接管响应、给用户更友好的提示。

开发环境可以设 RouteHandlerOptions.ThrowOnBadRequest = false,让框架返回 400 而不是抛异常。

三、OpenAPI

改进 说明
OpenAPI 3.2.0 通过options.OpenApiVersion = OpenApiSpecVersion.OpenApi3_2启用
HTTP QUERY 方法 ​MapMethods​支持 QUERY 谓词,3.2 原生描述,旧版用x-oai-additionalOperations扩展
二进制文件响应 ​FileContentResult​自动生成type: string, format: binary架构
文件流结果类型 ​FileStreamResult​、FileContentHttpResult​、FileStreamHttpResult现在显示为二进制字符串架构

示例------描述文件下载响应:

less 复制代码
 app.MapPost("/file", () => TypedResults.File(content))
    .Produces<FileContentResult>(contentType: MediaTypeNames.Application.Octet);

四、身份验证和授权

Identity 支持 TimeProvider

所有跟时间相关的操作改用 TimeProvider,测试时注入 fake provider 即可:

ini 复制代码
 services.AddSingleton<TimeProvider>(fakeTimeProvider);
 services.AddIdentity<IdentityUser, IdentityRole>();

验证器名称自动推断

根据 AAGUID 自动识别常见的 WebAuthn 验证器并填充友好名称(Google、iCloud、Windows Hello 等),不用手动配了。

五、性能

Kestrel HTTP/1.1 提速

解析器改用非抛异常路径,吞吐量提升 20-40% 。这是本次版本中最直接的性能收益。

HTTP 日志中间件池化

​ResponseBufferingStream 改用对象池,减少 GC 分配。

运行时异步优化

共享框架内部启用了 runtime-async 优化,减少 async/await 的内存分配。公共 API 没有任何变化,但建议在预览阶段做好回归测试------异常堆栈和 AsyncLocal 行为可能有微小变化。

六、基础设施

Zstandard 压缩

支持 zstd 响应压缩和请求解压缩,默认启用:

scss 复制代码
 builder.Services.AddResponseCompression();
 builder.Services.AddRequestDecompression();
 builder.Services.Configure<ZstandardCompressionProviderOptions>(...)

注意已经有 Brotli 和 Gzip 的情况下是否需要再加一层 zstd。

HTTP/3 提前处理请求

不必等控制流和 SETTINGS 帧到位就能开始处理请求,减少首次请求延迟。

WSL 证书信任

​dotnet dev-certs https --trust 在 WSL 下会同时在 Windows 和 WSL 两侧信任开发证书。

原生 OpenTelemetry 追踪

ASP.NET Core 原生添加 OpenTelemetry 语义约定属性,不再需要额外安装 OpenTelemetry.Instrumentation.AspNetCore​。如果想关掉,设 Microsoft.AspNetCore.Hosting.SuppressActivityOpenTelemetryData 开关。

响应压缩始终输出 Vary: Accept-Encoding

修复了缓存代理可能把压缩内容提供给不支持压缩的客户端的 bug。

Kestrel TLS 握手可观测性

​ITlsHandshakeFeature​ 新增 Exception​ 属性,可捕获握手失败详情。ListenOptions.UseTlsClientHelloListener 替代旧回调 API。

MCP 服务器模板

​dotnet new mcpserver 现在直接内置在 SDK 里,不用额外安装包。MCP(Model Context Protocol)是 AI 工具和代码服务之间的标准通信协议。

七、重大变更

  • Microsoft.OpenAPI 库更新至 3.3.1,包含基础库的 breaking changes(参考升级指南)
  • runtime-async 优化可能导致堆栈和 AsyncLocal 行为变化

一点看法 :这次更新最值得关注的是两件事------Kestrel 的 20-40% 吞吐量提升 对生产环境是立竿见影的收益,MCP 服务器模板进 SDK 则预示了 .NET 生态在 AI 集成方向的布局。其他改进更像是"把欠的债还上":虚拟化重写、OpenAPI 3.2、TimeProvider 支持 Identity------都在填补之前版本留下的空白。

相关推荐
Thneonl23 分钟前
全集群钟差 300 毫秒会发生什么:证书悄悄过期,日志倒流
运维·后端
金銀銅鐵23 分钟前
[Java] 借助GUI展示class文件的版本号
后端·python·ai编程
马剑威(威哥爱编程)28 分钟前
【AI全栈后端12-12】Spring Boot 3.x 到 4.x 迁移实操:Jakarta 11、Jackson 3 与 AI 2.0
java·开发语言·spring boot·后端
136096757231 小时前
一台 4 核 8G 已经跑了 6 个站点,我是怎么把第 7 个塞进去的
后端
对象存储与RustFS1 小时前
JuiceFS + 对象存储:把 S3 变成 POSIX 文件系统实测
后端·rust·开源
她的男孩1 小时前
企业接口照样拦得住:独立 Flyway、@RequiresFeature 与离线许可证
java·spring boot·后端
十年Java程序媛1 小时前
Lambda 与函数式接口|别只会复制 ()->{},底层规则和坑一次性讲清
java·spring boot·后端
yunwei371 小时前
eBPF 入门开发实践教程一:Hello World,基本框架和开发流程
linux·后端·性能优化
全栈Agent 小李1 小时前
【无标题】
前端·后端·agent·ai编程·全栈·cursor·mcp
高频因子挖掘机1 小时前
历史 K 线突然少一天?用交易日历、停牌信息和数据校验逐步排查
后端·github·api