public interface IExceptionHandler
ValueTask<bool> TryHandleAsync(HttpContext httpContext, Exception exception, CancellationToken cancellationToken);
感谢Arvin Kahbazi 对此功能的贡献!
SignalR
SignalR 无缝重连
这个预览版包括对 SignalR 中“无缝重新连接”的早期支持。这个功能旨在减少客户端感知到的宕机时间,这些宕机时间可能是由于切换网络连接、通过隧道等原因造成的网络连接暂时中断。它通过在服务器和客户端上临时缓冲数据并确认两者发送的消息,识别当连接返回时以及连接中断时可能已发送的消息来实现此目的。
由于该功能还在设计中,所以还没有任何配置,支持仅限于使用 WebSocket 的 .NET 客户端。
要选择使用该功能,请更新您的 .NET 客户端代码以启用该选项:
var hubConnection = new HubConnectionBuilder()
.WithUrl("<hub url>",
options =>
options.UseAcks = true;
.Build();
在未来的预览版中,可能会有从服务器端禁用该功能的选项、将发生缓冲的配置以及超时限制。此外,还将增加对其他传输和客户端的支持。
请在 https://github.com/dotnet/aspnetcore/issues/46691 提供反馈并关注该功能的进展。
Blazor
新的 Blazor Web App项目模板
在这个预览版中,我们引入了一个新的 Blazor 项目模板:Blazor Web App 模板。这个新模板为使用 Blazor 组件来构建任何风格的 Web UI(包括服务器端渲染和客户端渲染)提供了单一起点。它将现有 Blazor Server 和 Blazor WebAssembly 托管模型的优势与我们在 .NET 8 中添加的新 Blazor 功能相结合:服务器端渲染、流式渲染、增强的导航和表单处理,以及在每个组件的基础上使用Blazor Server或Blazor WebAssembly添加交互性的能力。在这个预览版中,并非所有功能都已启用,新的Blazor Web App模板提供了一种便捷的方式来尝试这些可用的新功能。
您可以通过运行以下命令行创建一个新的 Blazor Web App:
dotnet new blazor -o BlazorWebApp
新的 Blazor Web App 项目模板可以在 Visual Studio 中使用:
默认情况下,Blazor Web App模板是为Razor组件的服务器端渲染而设置的。在Program.cs中,调用AddRazorComponents()添加相关的服务,然后MapRazorComponents<App>()发现可用的组件并指定应用程序的根组件。
Program.cs
using BlazorWebApp;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorComponents();
var app = builder.Build();
// ...
app.MapRazorComponents<App>();
app.Run();
Blazor Web App模板中的根App组件定义了根 HTML 内容、设置了 Blazor 路由并添加了blazor.web.js脚本。不再需要IRazorComponentApplication接口。
App.razor
<!DOCTYPE html>
<html lang="en">
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<title>BlazorWebApp1</title>
<base href="/" />
<link href="css/bootstrap/bootstrap.min.css" rel="stylesheet" />
<link href="css/app.css" rel="stylesheet" />
<link rel="icon" type="image/png" href="favicon.png" />
<link href="BlazorWebApp1.styles.css" rel="stylesheet" />
<HeadOutlet />
</head>
<Router AppAssembly="@typeof(App).Assembly">
<Found Context="routeData">
<RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
<FocusOnNavigate
RouteData="@routeData" Selector="h1" />
</Found>
<NotFound>
<PageTitle>Not found</PageTitle>
<LayoutView Layout="@typeof(MainLayout)">
<p role="alert">Sorry, there's nothing at this address.</p>
</LayoutView>
</NotFound>
</Router>
</body>
</html>
Blazor 路由与端点路由集成
Blazor Router组件现在集成了端点路由来处理服务器端和客户端路由。这意味着使用服务器端渲染路由到组件的工作方式与使用客户端渲染一样。这也意味着您现在可以使用Router来指定默认布局。
新的 Blazor Web App模板包括几个带有路由的示例页面。Index.razor定义应用程序的主页并只包含一些基本标记。ShowData.razor使用流式渲染来显示一些天气预报数据。Router组件与端点路由集成之后将请求路由到这些页面。
请注意,当前每个页面导航都需要完整的页面加载。默认情况下,应用程序没有设置客户端路由,而且我们还没有添加对增强页面导航的支持。在未来的 .NET 8 预览版本中即将推出增强型导航功能。
使用Blazor Server启用各个组件的交互性
在 .NET 8 Preview 5 中,我们现在可以使用 Blazor Server 渲染模式为各个组件启用交互性。您可以使用 AddServerComponents 扩展方法启用与 Blazor Server 的交互性,然后使用新的 [RenderModeServer] 属性启用特定组件的交互性。
新的 Blazor Web App 模板默认情况下不会设置任何类型(Blazor Server 或 Blazor WebAssembly)的交互性,所以没有Counter组件。但我们可以添加一个Counter组件并自行设置它以实现交互。
添加一个带有Counter组件的页面:
通过添加包含以下内容的Pages/Counter.razor文件来创建计数器页面:
<!DOCTYPE html>
<html lang="en">
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<title>BlazorWebApp1</title>
<base href="/" />
<link href="css/bootstrap/bootstrap.min.css" rel="stylesheet" />
<link href="css/app.css" rel="stylesheet" />
<link rel="icon" type="image/png" href="favicon.png" />
<link href="BlazorWebApp1.styles.css" rel="stylesheet" />
<HeadOutlet />
</head>
<Router AppAssembly="@typeof(App).Assembly">
<Found Context="routeData">
<RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
<FocusOnNavigate RouteData="@routeData" Selector="h1" />
</Found>
<NotFound>
<PageTitle>Not found</PageTitle>
<LayoutView Layout="@typeof(MainLayout)">
<p role="alert">Sorry, there's nothing at this address.</p>
</LayoutView>
</NotFound>
</Router>
</body>
</html>
更新Shared/NavMenu.razor为计数器页面添加链接:
<div class="nav-item px-3">
<NavLink class="nav-link" href="counter">
<span class="oi oi-plus" aria-hidden="true"></span> Counter
</NavLink>
您现在可以浏览到计数器页面,但计数器按钮还不能工作,因为该页面只是在服务器端呈现。
使用 Blazor Server 设置Counter组件的交互性:
在Program.cs中添加 Blazor Server 交互服务:
builder.Services.AddRazorComponents()
.AddServerComponents();
在Pages/Counter.razor中添加[RenderModeServer]属性:
@attribute [RenderModeServer]
现在,当您浏览到计数器页面时,它应该是交互式的。当您浏览到该页面时,将建立 Blazor Server连接。当您单击Counter按钮时,会触发onclick事件,从而增加计数。
如果你想创建一个已经设置了交互式计数器的Blazor Web App,你可以通过以下命令行实现:
dotnet new blazor --use-server -o BlazorWebApp
在Visual Studio中创建 Blazor Web App时,–use-server选项目前还不可用,但我们预计很快就会添加它。
在这个预览版中,一旦 Blazor Server连接和回路建立起来,即使您离开计数器页面,它也会一直存在。 我们期望在未来的更新中改进回路寿命的管理方式。 此外,虽然此预览中添加了 Blazor WebAssembly 渲染模式的一些 API(例如 [RenderModeWebAssembly] 属性),但对在 WebAssembly 上交互运行的支持尚未完全实现。 这将会添加在未来的更新中。
改进了 Webcil 文件的打包
Webcil 是适用于 .NET 程序集的新型 Web 打包格式,旨在支持在限制性网络环境中使用 Blazor WebAssembly。。在 .NET 8 Preview 5 中,我们通过添加标准 WebAssembly 包装器改进了 Webcil 格式。这意味着 Webcil 文件现在只是具有标准 .wasm 扩展名的 WebAssembly 文件。
现在,当您发布 Blazor WebAssembly 应用程序时,Webcil 是默认打包格式。如果您想禁用 Webcil,您可以在项目文件中设置
<WasmEnableWebcil>false</WasmEnableWebcil>。
Blazor 内容安全策略 (CSP) 兼容性
Blazor WebAssembly在指定内容安全策略 (CSP) 时不再需要启用unsafe-eval脚本源。
API编写
支持泛型属性
这些属性以前需要 System.Type 参数的属性,但是现在以更简洁的通用变体形式提供。 这是通过 C# 11 中对泛型属性的支持实现的。例如,可以按如下方式修改用于注释操作响应类型的语法:
[ApiController]
[Route("api/[controller]")]
public class TodosController : Controller
[HttpGet("/")]
// Before: [ProducesResponseType(typeof(Todo), StatusCodes.Status200OK)]
[ProducesResponseType<Todo>(StatusCodes.Status200OK)]
public Todo Get() => new Todo(1, "Write a sample", DateTime.Now, false);
以下属性支持泛型变体:
[ProducesResponseType<T>]
[Produces<T>]
[MiddlewareFilter<T>]
[ModelBinder<T>]
[ModelMetadataType<T>]
[ServiceFilter<T>]
[TypeFilter<T>]
Native AOT
在编译时生成的最小API中支持AsParameters和自动生成元数据
在 .NET 8 Preview 3 中,我们为最小API引入了编译时代码生成功能,以支持Native AOT 场景。在这个预览版中,现在在编译时生成的最小 API 包括对使用AsParameters属性修饰的参数的支持,以及支持请求和响应类型的自动元数据推断。
例如,在下面的示例中,生成的代码将:
从查询中绑定一个projectId参数
从 JSON 正文绑定Todo参数
注释端点元数据以指示它接受 JSON 有效负载
注释端点元数据以指示它返回 Todo作为 JSON 负载
var app = WebApplication.Create();
app.MapPost("/todos", ([AsParameters] CreateTodoArgs payload) =>
if (payload.TodoToCreate is not null)
return payload.TodoToCreate;
return new Todo(0, "New todo", DateTime.Now, false);
app.Run();
record CreateTodoArgs(int ProjectId, Todo? TodoToCreate);
record Todo(int Id, string Name, DateTime CreatedAt, bool IsCompleted);
这种行为与最小 API 的运行时代码生成的行为相匹配。
认证与授权
ASP.NET Core SPA 模板中的身份验证更新
ASP.NET Core React 和 Angular 项目模板不再依赖 Duende IdentityServer。相反,这些模板现在使用默认的 ASP.NET Core Identity UI 和 cookie 身份验证来处理单个用户帐户的身份验证。这使得我们可以创建安全的单页应用程序 (SPA) 项目,而无需配置和管理全功能 OpenID Connect (OIDC) 服务器的复杂性。对于仍需要完整 OIDC 支持的项目,您可以使用 Duende项目模板通过 ASP.NE T Core Identity 设置 Duende IdentityServer。
推荐 AuthorizationBuilder 用法的新分析器
在 .NET 7 中,我们引入了对 AddAuthorizationBuilder API 的支持,它允许用户使用更简洁的调用模式来注册授权服务和配置授权策略。在此预览版中,我们引入了新的 Roslyn 分析器,以支持在适用的情况下使用新的 AddAuthorizationBuilder API 更新到 terser 语法。
感谢社区成员David Acker对新的分析器的贡献!
我们希望您喜欢 .NET 8 中的 ASP.NET Core的预览版。请在GitHub上提交问题来告诉我们您对这些新改进的看法。
感谢您使用 ASP.NET Core!
.NET 8 Preview 5推出!
作者:Jiachen Jiang 原文:Announcing .NET 8 Preview 5 - .NET Blog (microsoft.com)
我们很高兴与您分享 .NET 8 Preview 5...
0 comment
C# 12预览版的新功能
作者: Kathleen Dollard 原文:New C# 12 preview features - .NET Blog (microsoft.com)
Visual Studio 17.7 Preview 3 和 .NET 8 Preview 6 的发布推进了C...
0 comment