发布日期: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------都在填补之前版本留下的空白。