【译】.NET 7 预览版 1 中的 ASP.NET Core 更新
原文 | Daniel Roth
翻译 | 郑子铭
.NET 7 预览版 1 现已推出!这是 .NET 下一个主要版本的第一个预览版,其中将包括使用 ASP.NET Core 进行 Web 开发的下一波创新。
在 .NET 7 中,我们计划对 ASP.NET Core 进行广泛投资。以下是我们计划重点关注的一些领域:
- 性能:.NET 6 包含对 ASP.NET Core 的许多性能改进,我们将努力使 ASP.NET Core 在 .NET 7 中更快、更高效。
- HTTP/3:HTTP/3 支持作为 .NET 6 中的预览功能提供。对于 .NET 7,我们希望完成它并使其成为默认启用的受支持功能。在未来的预览版中,您可以期待在我们的 HTTP/3 支持中看到高级 TLS 功能和更多性能改进。
- 最小 API:添加对端点过滤器和路由分组的支持,作为最小 API 的核心原语。通常还简化 API 的身份验证和授权配置。
- gRPC:我们正在投资 gRPC JSON 转码。此功能允许 gRPC 服务像带有 JSON 请求和响应的 RESTful HTTP API 一样被调用。
- SignalR:添加对强类型客户端的支持并从客户端调用返回结果。
- Razor:我们将对 Razor 编译器进行各种改进,以提高性能、弹性并促进改进的工具。
- Blazor:在完成对 .NET MAUI、WPF 和 Windows 窗体的 Blazor Hybrid 支持后,我们将对 Blazor 进行广泛的改进,包括:
- 新的 .NET WebAssembly 功能:混合模式 AOT、多线程、Web 加密。
- 增强的热重载支持。
- 数据绑定改进。
- 更灵活的预渲染。
- 更好地控制 Blazor 服务器电路的生命周期。
- 改进了对微前端的支持。
- MVC:对端点路由、链接生成和参数绑定的改进。
- Orleans:ASP.NET Core 和 Orleans 团队正在研究进一步调整和集成 Orleans 分布式编程模型与 ASP.NET Core 的方法。 Orleans 4 将与 .NET 7 一起发布,并专注于简单性、可维护性和性能,包括人类可读的流标识和新的优化、版本容忍的序列化程序。
有关为 .NET 7 计划的特定 ASP.NET Core 工作的更多详细信息,请参阅 GitHub 上针对 .NET 7 的完整 ASP.NET Core 路线图。
.NET 7 Preview 1 是众多 .NET 7 预览版中的第一个,为 2022 年 11 月的 .NET 7 版本做准备。
我在最近一集 On .NET 中加入了 James Montemagno,以分解 .NET 7 和 .NET 7 中的 ASP.NET Core 中的所有内容:
以下是此预览版中新增内容的摘要:
- 最小的 API 改进:
- IFormFile 和 IFormFileCollection 支持
- 将请求正文绑定为 Stream 或 PipeReader
- JSON 选项配置
- SignalR 客户端源生成器
- 支持 MVC 视图和 Razor 页面中的可为空模型
- 在验证错误中使用 JSON 属性名称
- 改进了 dotnet watch 的控制台输出
- 将 dotnet watch 配置为始终重新启动以进行粗鲁的编辑
- 在 ValidationAttribute 中使用依赖注入
- 更快的标头解析和写入
- gRPC JSON 转码
开始使用
要开始使用 .NET 7 Preview 1 中的 ASP.NET Core,请安装 .NET 7 SDK。
如果您在 Windows 上使用 Visual Studio,我们建议安装最新的 Visual Studio 2022 预览版。 Visual Studio for Mac 对 .NET 7 预览的支持尚不可用,但即将推出。
要安装最新的 .NET WebAssembly 构建工具,请从提升的命令提示符处运行以下命令:
dotnet workload install wasm-tools
升级现有项目
要将现有的 ASP.NET Core 应用从 .NET 6 升级到 .NET 7 Preview 1:
- 将您的应用程序的目标框架更新为 net7.0。
- 将所有 Microsoft.AspNetCore.* 包引用更新到 7.0.0-preview.1.*。
- 将所有 Microsoft.Extensions.* 包引用更新到 7.0.0-preview.1.*。
另请参阅 .NET 7 的 ASP.NET Core 中的重大更改的完整列表。
最小的 API 改进
IFormFile 和 IFormFileCollection 支持
您现在可以使用 IFormFile 和 IFormFileCollection 在最少的 API 中处理文件上传:
app.MapPost("/upload", async(IFormFile file) =>
{
using var stream = System.IO.File.OpenWrite("upload.txt");
await file.CopyToAsync(stream);
});
app.MapPost("/upload", async (IFormFileCollection myFiles) => { ... });
将此功能与身份验证一起使用需要防伪支持,但尚未实现。我们的 .NET 7 路线图包含对最小 API 的防伪支持。当请求包含 Authorization 标头、客户端证书或 cookie 标头时,绑定到 IFormFile 或 IFormFileCollection 当前被禁用。我们将在完成防伪支持工作后立即解决此限制。
感谢 @martincostello 贡献此功能。
将请求正文绑定为 Stream 或 PipeReader
您现在可以将请求正文绑定为 Stream 或 PipeReader,以有效地支持用户必须摄取数据并将其存储到 blob 存储或将数据排队到队列提供程序(Azure 队列等)以供以后处理的场景工作者或云功能。以下示例显示了如何使用新绑定:
app.MapPost("v1/feeds", async (QueueClient queueClient, Stream body, CancellationToken cancellationToken) =>
{
await queueClient.CreateIfNotExistsAsync(cancellationToken: cancellationToken);
await queueClient.SendMessageAsync(await BinaryData.FromStreamAsync(body), cancellationToken: cancellationToken);
});
使用 Stream 或 PipeReader 时,需要考虑以下几点:
- 摄取数据时,Stream 将是与 HttpRequest.Body 相同的对象。
- 默认情况下不缓冲请求正文。读取正文后,它不可回退(您不能多次读取流)。
- Stream/PipeReader 在最小操作处理程序之外不可用,因为底层缓冲区将被释放和/或重用。
JSON 选项配置
我们正在引入一个新的更简洁的 API,ConfigureRouteHandlerJsonOptions,为最小的 API 端点配置 JSON 选项。这个新的 API 避免了与 Microsoft.AspNetCore.Mvc.JsonOptions 的混淆。
var builder = WebApplication.CreateBuilder(args);
builder.Services.ConfigureRouteHandlerJsonOptions(options =>
{
//Ignore Cycles
options.SerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles;
});
SignalR 客户端源生成器
感谢@mehmetakbulut 的贡献,我们为 SignalR 添加了一个新的客户端源生成器。
SignalR 客户端源生成器根据您定义的接口生成强类型的发送和接收代码。您可以在客户端上重用来自强类型 SignalR 集线器的相同接口来代替松散类型的 .On("methodName", ...) 方法。同样,您的集线器可以为其方法实现一个接口,并且客户端可以使用该相同接口来调用集线器方法。
要使用 SignalR 客户端源生成器:
- 添加对 Microsoft.AspNetCore.SignalR.Client.SourceGenerator 包的引用。
- 将 HubServerProxyAttribute 和 HubClientProxyAttribute 类添加到您的项目中(这部分设计可能会在未来的预览版中更改):
[AttributeUsage(AttributeTargets.Method)]
internal class HubServerProxyAttribute : Attribute
{
}
[AttributeUsage(AttributeTargets.Method)]
internal class HubClientProxyAttribute : Attribute
{
}
- 为您的项目添加一个静态分部类,并使用 [HubClientProxy] 和 [HubServerProxy] 属性编写静态分部方法
internal static partial class MyCustomExtensions
{
[HubClientProxy]
public static partial IDisposable ClientRegistration<T>(this HubConnection connection, T provider);
[HubServerProxy]
public static partial T ServerProxy<T>(this HubConnection connection);
}
- 使用代码中的部分方法!
public interface IServerHub
{
Task SendMessage(string message);
Task<int> Echo(int i);
}
public interface IClient
{
Task ReceiveMessage(string message);
}
public class Client : IClient
{
// Equivalent to HubConnection.On("ReceiveMessage", (message) => {});
Task ReceiveMessage(string message)
{
return Task.CompletedTask;
}
}
HubConnection connection = new HubConnectionBuilder().WithUrl("...").Build();
var stronglyTypedConnection = connection.ServerProxy<IServerHub>();
var registrations = connection.ClientRegistration<IClient>(new Client());
await stronglyTypedConnection.SendMessage("Hello world");
var echo = await stronglyTypedConnection.Echo(10);
支持 MVC 视图和 Razor 页面中的可为空模型
我们启用了定义一个可为空的页面或视图模型来改进在 ASP.NET Core 应用中使用空状态检查时的体验:
@model Product?
在验证错误中使用 JSON 属性名称
当模型验证生成 ModelErrorDictionary 时,默认情况下它将使用属性名称作为错误键(“MyClass.PropertyName”)。模型属性名称通常是一个实现细节,这会使它们难以从单页应用程序中处理。您现在可以将验证配置为使用相应的 JSON 属性名称,而不是使用新的 SystemTextJsonValidationMetadataProvider(或使用 Json.NET 时的 NewtonsoftJsonValidationMetadataProvider)。
services.AddControllers(options =>
{
options.ModelMetadataDetailsProviders.Add(new SystemTextJsonValidationMetadataProvider())
});
改进了 dotnet watch 的控制台输出
我们清理了 dotnet watch 的控制台输出,以更好地与 ASP.NET Core 的注销保持一致,并在表情符号.中脱颖而出。
以下是新输出的示例:
C:BlazorApp> dotnet watch
dotnet watch Hot reload enabled. For a list of supported edits, see https://aka.ms/dotnet/hot-reload.
Press "Ctrl + R" to restart.
dotnet watch Building...
Determining projects to restore...
All projects are up-to-date for restore.
You are using a preview version of .NET. See: https://aka.ms/dotnet-support-policy
BlazorApp -> C:UsersdarothDesktopBlazorAppbinDebugnet7.0BlazorApp.dll
dotnet watch Started
info: Microsoft.Hosting.Lifetime[14]
Now listening on: https://localhost:7148
info: Microsoft.Hosting.Lifetime[14]
Now listening on: http://localhost:5041
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
Content root path: C:UsersdarothDesktopBlazorApp
dotnet watch File changed: .PagesIndex.razor.
dotnet watch Hot reload of changes succeeded.
info: Microsoft.Hosting.Lifetime[0]
Application is shutting down...
dotnet watch Shutdown requested. Press Ctrl+C again to force exit.
将 dotnet watch 配置为始终重新启动以进行粗鲁的编辑
通过将 DOTNET_WATCH_RESTART_ON_RUDE_EDIT 环境变量设置为 true,将 dotnet watch 配置为始终在不提示粗鲁编辑(无法热重新加载的编辑)的情况下重新启动。
将服务注入 Blazor 中的自定义验证属性
您现在可以将服务注入 Blazor 中的自定义验证属性。 Blazor 将设置 ValidationContext,以便它可以用作服务提供者。
public class SaladChefValidatorAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var saladChef = validationContext.GetRequiredService<SaladChef>();
if (saladChef.ThingsYouCanPutInASalad.Contains(value.ToString()))
{
return ValidationResult.Success;
}
return new ValidationResult("You should not put that in a salad!");
}
}
// Simple class configured as a service for dependency injection
public class SaladChef
{
public string[] ThingsYouCanPutInASalad = { "Strawberries", "Pineapple", "Honeydew", "Watermelon", "Grapes" };
}
感谢@MariovanZeist 的贡献!
更快的标头解析和写入
我们对 HTTP/2 和 HTTP/3 的标头解析和写入性能进行了多项改进。有关详细信息,请参阅以下拉取请求:
gRPC JSON 转码
gRPC JSON 转码允许 gRPC 服务像 RESTful HTTP API 一样使用。配置完成后,gRPC JSON 转码允许您使用熟悉的 HTTP 概念调用 gRPC 方法:
- HTTP 动词
- URL参数绑定
- JSON 请求/响应
当然 gRPC 也可以继续使用。用于 gRPC 服务的 RESTful API。没有重复!
ASP.NET Core 使用名为 gRPC HTTP API 的库对此功能提供实验性支持。对于 .NET 7,我们计划将此功能作为 ASP.NET Core 的受支持部分。此功能尚未包含在 .NET 7 中,但您可以试用现有的实验包。有关更多信息,请参阅 gRPC HTTP API 入门文档。
给予反馈
我们希望您喜欢 .NET 7 中的 ASP.NET Core 预览版,并且您对我们的 .NET 7 路线图和我们一样兴奋!我们很想听听您对此版本的体验以及您对路线图的看法。通过在 GitHub 上提交问题并评论路线图问题,让我们知道您的想法。
感谢您试用 ASP.NET Core!
原文链接
ASP.NET Core updates in .NET 7 Preview 1
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: http://www.cnblogs.com/MingsonZheng/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。
如有任何疑问,请与我联系 (MingsonZheng@outlook.com) 。
【译】.NET 7 预览版 1 中的 ASP.NET Core 更新的更多相关文章
- .NET 7 预览版2 中的 ASP.NET Core 更新
.NET 7 预览版2 现已推出,其中包括对ASP.NET Core 的许多重大改进. 以下是此预览版中新增内容的摘要: 推断来自服务的API 控制器操作参数 SignalR 集线器方法的依赖注入 为 ...
- .NET Core 3.0预览版7中的ASP.NET Core和Blazor更新
.NET Core 3.0 Preview 7现已推出,它包含一系列ASP.NET Core和Blazor的新更新. 以下是此预览中的新功能列表: 最新的Visual Studio预览包括.NET C ...
- 根据 Power BI Desktop(预览版)中的报表页创建工具提示
根据 Power BI Desktop 中创建的报表页,可创建直观丰富的报表工具提示,这些提示在你将鼠标悬停在视觉对象上时显示. 通过创建用作工具提示的报表页,使自定义工具提示包含视觉对象.图像以及在 ...
- .NET 5 Preview 1中的ASP.NET Core更新 (2020年3月16日)
.NET 5 Preview1现在可用,可以进行评估了! .NET 5将是当前版本. 开始 要在.NET 5.0中开始使用 ASP.NET Core,请安装.NET 5.0 SDK. 如果您使用的是W ...
- .NET 5.0预览版6发布:支持Windows ARM64设备
2020年6月25日,微软dotnet团队在博客宣布了第六个 .NET 5.0 的预览版:https://devblogs.microsoft.com/dotnet/announcing-net-5- ...
- 官宣.NET 6 预览版4
我们很高兴发布 .NET 6 Preview 4.我们现在大约完成了 .NET 6 发布的一半.现在是一个很好的时机,可以再次查看.NET6的完整范围.许多功能都接近最终形式,而其他功能将很快推出,因 ...
- .NET 6 预览版 5 发布
很高兴.NET 6 预览版5终于跟大家见面了.我们现在正处于.NET 6 的后半部分,开始整合一些重要的功能. 例如.NET SDK 工作负载,它是我们.NET 统一愿景的基础,可以支持更多类型的应用 ...
- 官宣 .NET MAUI 预览版 6
最近,我们发布了.NET 多平台应用程序UI (MAUI)的最新进展. 在此版本中,我们全力支持Visual Studio 2022 预览版2.这也标志着我们首次将.NET MAUI 作为工作负载安装 ...
- .NET 6 预览版 7 发布——最后一个预览版
原文:bit.ly/2VJxjxQ 作者:Richard 翻译:精致码农-王亮 说明:文中有大量的超链接,这些链接在公众号文章中被自动剔除,一部分包含超链接列表的小段落被我删减了,如果你对此感兴趣,请 ...
随机推荐
- 右键没有word?excel?ppt?注解表该改改啦
✿[office 2019]office2010版本以上的都可以(例如:office 2010.office 2016.office 2019) 一.快速方法解决右键没有word: 在电脑桌面右键一个 ...
- Redis 源码简洁剖析 05 - ziplist 压缩列表
ziplist 是什么 Redis 哪些数据结构使用了 ziplist? ziplist 特点 优点 缺点 ziplist 数据结构 ziplist 节点 pre_entry_length encod ...
- 海康NVR设备上传人脸图片到人脸库
海康开放平台--海康文档链接--海康开发包和文档下载链接 硬件:海康超脑NVR(全称Network Video Recorder,即网络视频录像机).人脸摄像机. 环境:JDK_1.8 Windows ...
- 「ZJOI2017」树状数组
「ZJOI2017」树状数组 以下均基于模2意义下,默认\(n,m\)同阶. 熟悉树状数组的应该可以发现,这题其实是求\(l-1\)和\(r\)位置值相同的概率. 显然\(l=1\)的情况需要特盘. ...
- Redis集群安装详细步骤
环境: Centos7 redis3.0 三台虚拟机主机名分别为 master node1 node2 如果单机的时候设置过密码最好把密码去掉,避免位置的错误. 拍个快照方便恢复. 1.创 ...
- 入门-k8s部署应用 (三)
Kubernetes 部署应用 在 k8s 上进行部署前,首先需要了解一个基本概念 Deployment Deployment 译名为 部署.在k8s中,通过发布 Deployment,可以创建应用程 ...
- Android数据库的事务
事务: 执行多条sql语句,要么同时执行成功,要么同时执行失败,不能有的成功,有的失败 银行转账 //点击按钮执行该方法 public void transtation(View v){ // ...
- 前端也能做AI
殷圣魁 58架构师 7月16日 原文链接 前言 相信不少人看过一篇人工智能已经能实现自动编写HTML,CSS的文章,人工智能开始取代前端的一部分工作.前端开发行业真的被人工智能取代吗? 1.人工智能发 ...
- 什么是UILabel
UILabel极其常用,功能比较专一:显示文字 UILabel的常见属性 @property(nonatomic,copy) NSString *text; 显示的文字 @property(nonat ...
- Msi.h causes compilation error in vs2010
创建一个Win32 Console工程ReadFromMSM,什么都不需要做. 在ReadFromMSM.cpp文件中引入头文件: #include <msi.h> 编译,会发现有成堆的错 ...