目录
如果传递给路由处理程序的参数类型未实现正确的接口,则发出警告
将异常发送到Blazor的SynchronizationContext
热重载支持WebAssembly上.NET的实例字段、属性和事件
macOS上的HTTP/2 over TLS(HTTPS)支持
gRPC JSON转码不再需要http.proto和annotations.proto
指定服务器超时并使用HubConnectionBuilder保持活动状态间隔设置
.NET 8预览版1现已推出!这是.NET下一个主要版本的首次预览,它将包括使用ASP.NET Core进行Web开发的下一波创新。
在.NET 8中,我们计划跨ASP.NET Core进行广泛的投资。以下是我们计划关注的一些领域:
使用Blazor的全栈Web UI
注意:以前此部分的标题为“Blazor United”,但为了避免混淆,我们不再使用该名称。相反,我们将重点介绍在.NET 8中添加到Blazor的新功能和增强功能,以实现全堆栈Web UI开发。
在今天的ASP.NET Core中,我们有几种不同的方法来构建Web UI:
- MVC & Razor Pages:框架使用服务器端渲染(SSR)从服务器动态生成HTML以响应请求。从服务器呈现有助于应用程序快速 加载,因为获取数据和决定如何显示数据的所有艰苦工作已经在服务器上完成——客户端只需要显示已经呈现的HTML。他们可以利用强大的服务器硬件,直接访问后端数据和服务。
- Blazor:Blazor 的组件模型专注于处理来自客户端的UI交互。服务器端呈现要求将每个UI交互发送到服务器,因此它不适合丰富的交互式UI。对于丰富的交互性,您需要使用客户端呈现(CSR),它具有低得多的延迟,并且可以轻松访问客户端功能。
许多新式Web应用需要结合使用这些方法,包括服务器端呈现和客户端呈现。也许你的主页或博客最好使用服务器端呈现来处理,以便它加载速度快且易于索引,而应用的更复杂的功能需要从客户端运行的响应能力。目前,对于.NET,这需要同时使用多个不同的框架:MVC、Razor页面和Blazor。
在.NET 8中,我们正在努力将服务器端和客户端呈现的优势合并到基于Blazor的单个全栈编程模型中。通过.NET 8中的Blazor,可以使用单个基于Blazor的体系结构进行服务器端呈现,并与Blazor Server或WebAssembly进行完全客户端交互。这一切都在一个项目中,能够在不同的渲染模式之间轻松切换,甚至在同一页面中混合它们。.NET 8中的Blazor还将启用新的呈现功能,例如流式呈现以及导航和表单post的渐进增强。
查看以下早期原型视频,该视频演示了许多这些新功能的实际应用:
相关GitHub问题:dotnet/aspnetcore#46636
改进的身份验证和授权体验
在某些情况下,身份验证和授权可能很难在ASP.NET Core应用中实现。在.NET 8中,我们的目标是:
- 为使用Web的身份验证和授权创建简单、直观且文档完善的体验,该体验易于开发和测试。
- 提供一组清晰的步骤和工具,以支持部署到生产环境。
- 提供有意义的诊断,帮助快速有效地解决安全问题。
原生AOT
.NET 7引入了对将 .NET控制台项目作为本机AOT发布的支持,从而生成一个独立的、特定于平台的可执行文件,而无需任何运行时JIT。本机AOT应用的启动速度非常快,并且使用更少的内存。可以将应用程序部署到未安装任何.NET运行时的计算机或容器。在.NET 8中,我们将把对本机AOT的支持扩展到ASP.NET Core,从使用最小API构建的以云为中心的API应用开始,这些应用可以满足有关已发布文件大小、启动时间、工作集和吞吐量性能的预期。
相关GitHub问题:dotnet/aspnetcore#45910
.NET 8的ASP.NET Core路线图
除了上述主题之外,我们还计划在ASP.NET Core中进行许多额外的改进。您可以在GitHub上的.NET 8 ASP.NET Core路线图中找到 .NET 8计划进行的ASP.NET Core 工作的完整列表。
.NET 8预览版1中有哪些新增功能?
.NET 8预览版1是众多.NET 8预览版中的第一个,为2023年8月的.NET发布做准备。
以下是此预览版中ASP.NET Core中的新增功能的摘要:
- 路由工具
- 路由约束性能改进
- 用于API开发的新分析器
- 将异常发送到Blazor的SynchronizationContext
- 热重载支持WebAssembly上.NET的实例字段、属性和事件
- 在WebAssembly上调试.NET时支持符号服务器
- Firefox中的Blazor WebAssembly调试
- .NET程序集的实验性Webcil格式
- 指定要加载的BlazorWebView初始URL
- 保持SPA开发服务器运行的新选项
- 支持Kestrel中的命名管道
- 默认启用HTTP/3
- macOS上的HTTP/2 over TLS(HTTPS)支持
- gRPC JSON转码不再需要http.proto和annotations.proto
- 指定服务器超时并使用HubConnectionBuilder保持活动状态间隔设置
- IPNetwork.Parse和TryParse
- HTTP_PORTS和HTTPS_PORTS配置支持
- 不使用指定的HTTP协议时的警告
开始
若要在.NET 8预览版1中开始使用ASP.NET Core,请安装.NET 8 SDK。
如果你使用的是Visual Studio,我们建议安装最新的 Visual Studio 2022预览版。Visual Studio for Mac对.NET 8预览版的支持尚不可用,但即将推出。
升级现有项目
若要将现有ASP.NET Core应用从.NET 7升级到.NET 8预览版1,请执行以下操作:
- 将应用程序的目标框架更新为net8.0。
- 将所有Microsoft.AspNetCore.*包引用更新为8.0.0-preview.1.*。
- 将所有Microsoft.扩展.*包引用更新为8.0.0-preview.1.*。
另请参阅适用于.NET 8的ASP.NET Core中中断性更改的完整列表。
路由工具
ASP.NET Core建立在路由之上。最小API、Web API、Razor页面和Blazor都使用路由来自定义HTTP请求映射到代码的方式。
在.NET 8中,我们投资了一套新功能,使路由更易于学习和使用。其中包括:
- 路由语法突出显示
- 自动完成参数和路由名称
- 自动完成路由约束
- 路线分析器和修复程序
- 支持最少的API、Web API和Blazor
组合在一起,我们将这些新功能称为路径工具。路由工具基于Roslyn构建,并具有根据您使用的IDE自动亮起的功能。请在预览版1中试用并向我们提供反馈。一篇介绍路线工具酷炫新功能的博客文章即将推出。
路由约束性能改进
ASP.NET Core路由是功能强大的高性能技术,几乎所有ASP.NET Core应用都使用它。路由的常用功能是路由约束。应用使用路由约束将请求匹配到正确的终结点:
// Endpoint only matches requests with a URL slug. For example: article/my-article-name
app.MapGet("article/{name:regex(^[a-z0-9]+(?:-[a-z0-9]+)*$)}", (string name) => { /* ... */ });
在.NET 8中,我们对约束进行了多项性能改进:
- 正则表达式约束现已编译。创建已编译的正则表达式在启动时会产生一次性成本,但它们可以最大限度地提高运行时性能。
- 重复约束现在在路由之间共享。共享缓存约束可减少启动时间和内存使用,尤其是对于具有许多路由和正则表达式约束的应用。
- alpha约束现在使用源生成的正则表达式。
用于API开发的新分析器
高质量的代码更易于调试、测试和维修。在.NET 8中,我们正在投资一套分析器,这些分析器将帮助你更有效地利用ASP.NET Core的API。从预览版1开始,可以利用新的分析器:
建议设置或追加到标题字典,而不是添加
如果添加了重复的键,IHeaderDictionary.Add API将引发。通常,需要使用索引器或IHeaderDictionary.Append API设置、替代或追加到标头。此分析器警告IHeaderDictionary.Add API的使用情况,并提供建议利用索引器或Append API的代码修复程序。
var context = new DefaultHttpContext();
context.Request.Headers.Add("Accept", "text/html"); // ASP0019 warning
context.Request.Headers["Accept"] = "text/html"; // Apply codefix using indexer
context.Request.Headers.Append("Accept", "text/html"); // Apply codefix using IHeaderDictionary.Append
感谢社区成员 @david-acker 的贡献!
如果传递给路由处理程序的参数类型未实现正确的接口,则发出警告
最小API支持从TryParse或BindAsync类型的实现中定义的使用规则的HttpContext元素进行简单绑定。这些实现必须符合特定的签名,以便被框架中的绑定逻辑所利用。从.NET 8开始,如果使用未实现相应接口的类型,你将收到警告。
例如,下面的代码示例将触发警告,因为该Customer类型未实现具有适当签名的BindAsync方法。
var app = WebApplication.Create();
app.MapGet("/customers/{customer}", (Customer customer) => {}); // ASP0021 warning
public class Customer
{
public async static Task<Customer> BindAsync(HttpContext context) => new Customer();
}
检测RequestDelegate是否未正确实现
RequestDelegate实现一个接受HttpContext并返回Task。因为Task是Task<T>的基本类型,泛型方差意味着可以编写如下代码:
var app = WebApplication.Create();
Task<string> HelloWorld(HttpContext c)
=> Task.FromResult("Hello " + c.Request.RouteValues["name"]); // ASP0016 warning
app.MapGet("/", HelloWorld);
但是,字符串响应将在运行时被丢弃。在.NET 8中,将为上述方案生成警告,可以通过进行以下代码更改来解决:
var app = WebApplication.Create();
Task HelloWorld(HttpContext c) => c.Response.WriteAsync("Hello " + c.Request.RouteValues["name"]);
app.MapGet("/", HelloWorld);
或者利用最少的API:
var app = WebApplication.Create();
app.MapGet("/{name}", (string name) => $"Hello {name}");
我们还要感谢社区成员@Youssef1313向我们现有的分析器提交了一系列质量改进和错误修复!
将异常发送到Blazor的SynchronizationContext
现在,可以使用ComponentBase和RenderHandle上的新DispatchExceptionAsync方法将异常调度到Blazor的SynchronizationContext。这允许你使用Blazor的错误处理功能(如错误边界)处理这些异常。
热重载支持WebAssembly上.NET的实例字段、属性和事件
WebAssembly上的.NET现在支持在使用热重载时向现有类添加实例字段、属性和事件。这还启用了在后台使用实例字段的其他C#和Razor语言功能,例如某些类型的C# lambda和Razor @bind指令的某些用法。
在WebAssembly上调试.NET时支持符号服务器
在WebAssembly上调试.NET时,调试器现在将从Visual Studio首选项中配置的符号位置下载符号数据。这改进了使用NuGet包的应用的调试体验。
Firefox中的Blazor WebAssembly调试
现在,您可以使用Firefox调试Blazor WebAssembly应用程序。调试Blazor WebAssembly应用需要配置浏览器以进行远程调试,然后通过.NET WebAssembly调试代理使用浏览器开发人员工具连接到浏览器。目前不支持来自Visual Studio的Debuggin Firefox。
要在开发过程中在Firefox中调试Blazor WebAssembly应用,请执行以下操作:
- 在Firefox中打开Blazor WebAssembly应用程序。
- 打开Firefox Web开发者工具,然后转到控制台选项卡。
- 在焦点中,使用Blazor WebAssembly应用键入调试命令SHIFT+ALT+D。
- 按照开发控制台输出中的说明配置Firefox以进行Blazor WebAssembly调试:
- 打开关于:在火狐中配置
- 使devtools.debugger.remote-enabled
- 使devtools.chrome.enabled
- 禁用devtools.debugger.prompt-connection
- 关闭所有Firefox实例,然后重新打开Firefox,并通过运行firefox --start-debugger-server 6000 -new-tab about:debugging启用远程调试。
- 在新的Firefox实例中,将about:debugging选项卡保持打开状态,然后在新的浏览器选项卡中打开Blazor WebAssembly应用。
- 键入SHIFT+ALT以打开Firefox Web Developer工具并连接到Firefox浏览器实例。
- 在Web开发人员工具的“调试器”选项卡中,在file://节点下打开要调试的应用源文件并设置断点。例如,在 Pages/Counter.razor 的IncrementCount方法中设置断点。
- 导航到计数器页面,然后单击计数器按钮以命中断点。
.NET程序集的实验性Webcil格式
在某些环境中,防火墙和防病毒工具会阻止下载或使用.dll文件,从而阻止使用基于.NET程序集的Web应用,如Blazor WebAssembly应用。为了解决此问题,wasm-experimental工作负荷现在支持一种新的.webcil文件格式,该格式可用于为基于浏览器的Web应用打包.NET程序集。目前,Webcil格式仅适用于实验性WebAssembly浏览器应用,但我们计划在将来的更新中为Blazor WebAssembly应用启用它。
要使用WebAssembly浏览器应用程序试用新的Webcil格式:
- 安装工作负载:wasm-experimentaldotnet workload install wasm-experimental
- 创建新应用:dotnet new wasmbrowser
- 将属性添加到文件:WasmEnableWebcil.csproj
<PropertyGroup>
<WasmEnableWebcil>true</WasmEnableWebcil>
</PropertyGroup>
4.运行应用并在浏览器中验证正在下载的是.webcil文件,而不是.dll文件。
如果您在环境中使用.webcil文件时遇到问题,请在 GitHub上创建问题,告知我们。
指定要加载的BlazorWebView初始URL
在BlazorWebView上的新属性StartPath允许您设置最初导航到的路径。当您希望在BlazorWebView加载后将用户直接带到特定页面时,这很有用。
保持SPA开发服务器运行的新选项
使用ASP.NET Core构建单页应用(SPA)时,SPA开发服务器和后端ASP.NET Core都需要在开发过程中执行。SPA开发服务器配置为将API请求代理到ASP.NET Core后端。当ASP.NET Core进程终止时,默认情况下,SPA开发服务器也会终止。重新启动SPA开发服务器可能既耗时又繁琐。SpaDevelopmentServerOptions启用的新KeepRunning选项允许即使ASP.NET Core进程终止,SPA开发服务器也保持运行。
支持Kestrel中的命名管道
命名管道是一种流行的技术,用于在Windows应用之间构建进程间通信(IPC)。现在,可以使用.NET、Kestrel和命名管道生成IPC服务器。
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.ListenNamedPipe("MyPipeName");
});
有关此功能以及如何使用.NET和gRPC创建IPC服务器和客户端的详细信息,请参阅与gRPC的进程间通信。
默认启用HTTP/3
HTTP/3是一项令人兴奋的互联网新技术,于2022年3月标准化。与旧的HTTP协议相比,HTTP/3提供了几个优点,包括:
- 更快的连接设置。
- 无线头阻塞。
- 网络之间更好的转换。
.NET 7为ASP.NET Core和Kestrel添加了对HTTP/3的支持。ASP.NET Core应用可以选择将其打开。在.NET 8中,我们默认启用HTTP/3(以及HTTP/1.1和HTTP/2)。
有关HTTP/3及其要求的详细信息,请参阅将 HTTP/3与ASP.NET Core Kestrel Web服务器配合使用。
macOS上的HTTP/2 over TLS(HTTPS)支持
您现在可以在macOS上将TLS和HTTP/2与ASP.NET Core配合使用。.NET 8为macOS添加了对应用层协议协商(ALPN)的支持。ALPN是一种TLS功能,用于协商连接将使用的HTTP协议。例如,ALPN允许浏览器和其他HTTP客户端请求HTTP/2连接。此功能对于需要HTTP/2的gRPC应用特别有用。
很高兴看到macOS上的这个摩擦点消失了!
gRPC JSON转码不再需要http.proto和annotations.proto
gRPC JSON转码是ASP.NET Core的扩展,可为gRPC服务创建RESTful JSON API。配置后,转码允许应用使用熟悉的HTTP概念(例如HTTP谓词、URL参数绑定和JSON请求/响应)调用gRPC服务。
我们简化了将JSON转码添加到.NET gRPC应用的过程。不再需要将http.proto文件复制和annotations.proto文件复制到应用中。在.NET 8预览版1中,这些文件包含在NuGet包中,并自动为你引用。
指定服务器超时并使用HubConnectionBuilder保持活动状态间隔设置
现在,您可以使用HubConnectionBuilder指定SignalR客户端的服务器超时并保持活动状态间隔设置。如果要在调试时增加超时以避免在执行暂停时遇到超时,这在Blazor Server应用中非常有用。
Blazor.start({
configureSignalR: function (builder) {
builder
.withServerTimeout(60000)
.withKeepAliveInterval(30000);
};
});
IPNetwork.Parse和TryParse
IPNetwork上新的Parse和TryParse方法增加了对使用 CIDR表示法或“斜杠表示法”的输入字符串创建IPNetwork的支持。
IPv4
// Using Parse
var network = IPNetwork.Parse("192.168.0.1/32");
// Using TryParse
bool success = IPNetwork.TryParse("192.168.0.1/32", out var network);
// Ctor equivalent
var network = new IPNetwork(IPAddress.Parse("192.168.0.1"), 32);
IPv6
// Using Parse
var network = IPNetwork.Parse("2001:db8:3c4d::1/128");
// Using TryParse
bool success = IPNetwork.TryParse("2001:db8:3c4d::1/128", out var network);
// Ctor equivalent
var network = new IPNetwork(IPAddress.Parse("2001:db8:3c4d::1"), 128);
感谢@david-acker的贡献!
HTTP_PORTS和HTTPS_PORTS配置支持
应用程序和容器通常只被赋予一个要侦听的端口(如80),而没有额外的约束,如主机或路径。HTTP_PORTS和HTTPS_PORTS是新的配置密钥,允许指定Kestrel和HttpSys服务器的侦听端口。这些可以使用DOTNET_或ASPNETCORE_环境变量前缀定义,也可以通过任何其他配置输入(如appsettings.json)直接指定。每个端口值都是以分号分隔的端口值列表。
ASPNETCORE_HTTP_PORTS=80;8080
ASPNETCORE_HTTPS_PORTS=443;8081
这是以下内容的简写,它指定方案(HTTP或HTTPS)和任何主机或IP。
ASPNETCORE_URLS=http://*:80/;http://*:8080/;https://*:443/;https://*:8081/
这些新的配置键优先级较低,将被直接在代码中提供的URL或值覆盖。证书仍需要通过特定于服务器的HTTPS机制单独配置。
不使用指定的HTTP协议时的警告
如果禁用了TLS并且HTTP/1.x可用,则HTTP/2和HTTP/3将被禁用,即使它们已指定。这可能会导致一些令人讨厌的意外,因此我们添加了警告输出,以便在发生时通知您。
提供反馈
我们希望你喜欢.NET 8中ASP.NET Core的预览版。通过在 GitHub上提交问题,让我们知道您对这些新改进的看法。
感谢您试用ASP.NET Core!
https://devblogs.microsoft.com/dotnet/asp-net-core-updates-in-dotnet-8-preview-1/