ASP.NET Core 10.0 中的新增功能

本文重点介绍了 ASP.NET Core 10.0 中最重要的更改,其中包含相关文档的链接。

本文将在提供新的预览版时更新。 在更新此页面之前,请参阅 Asp.Net 核心公告页

Blazor

本部分介绍 Blazor的新功能。

QuickGridRowClass 参数

根据行项,使用新的 RowClass 参数将样式表类应用于网格的一行。 在以下示例中,对每一行调用 GetRowCssClass 方法,根据行项有条件地应用样式表类:

<QuickGrid ... RowClass="GetRowCssClass">
    ...
</QuickGrid>

@code {
    private string GetRowCssClass(MyGridItem item) =>
        item.IsArchived ? "row-archived" : null;
}

有关详细信息,请参阅 ASP.NET Core Blazor “QuickGrid” 组件

Blazor 脚本作为静态 Web 资产

在 .NET 的早期版本中,Blazor 脚本从 ASP.NET Core 共享框架中的嵌入资源提供。 在 .NET 10 或更高版本中,Blazor 脚本用作具有自动压缩和指纹的静态 Web 资产。

有关详细信息,请参阅以下资源:

路由模板亮点

[Route] 属性 现在支持路由语法突出显示,以帮助可视化路由模板的结构:

计数器值的路由属性 计数器值的路由属性的路由模板模式显示语法高亮显示

SignalR

本部分介绍 SignalR的新功能。

最小 API

本部分介绍最小 API 的新功能。

OpenAPI

本部分介绍 OpenAPI 的新功能。

OpenAPI 3.1 支持

ASP.NET Core 添加了对在 .NET 10 中生成 OpenAPI 版本 3.1 文档的支持。 尽管版本有小幅升级,但 OpenAPI 3.1 是对 OpenAPI 规范的重大更新,特别是完全支持 JSON 架构草案 2020-12

在生成的 OpenAPI 文档中看到的一些更改包括:

  • 可以为 null 的类型不再具有架构中的 nullable: true 属性。
  • 它们没有 nullable: true 属性,而是具有一个 type 关键字,其值是包含 null 作为类型之一的数组。

使用此功能时,生成的文档的默认 OpenAPI 版本3.1。 通过在 AddOpenApiconfigureOptions 委托参数中显式设置 OpenApiOptionsOpenApiVersion 属性,可以更改版本。

builder.Services.AddOpenApi(options =>
{
    // Specify the OpenAPI version to use.
    options.OpenApiVersion = Microsoft.OpenApi.OpenApiSpecVersion.OpenApi3_0;
});

在生成时生成 OpenAPI 文档时,可以通过在 OpenApiGenerateDocumentsOptions MSBuild 项中设置 --openapi-version 来选择 OpenAPI 版本。

    <!-- Configure build-time OpenAPI generation to produce an OpenAPI 3.0 document. -->
    <OpenApiGenerateDocumentsOptions>--openapi-version OpenApi3_0</OpenApiGenerateDocumentsOptions>

OpenAPI 3.1 支持主要在以下 PR 中添加。

OpenAPI 3.1 重大更改

对 OpenAPI 3.1 的支持需要更新到新的主版本 2.0 的基础 OpenAPI.NET 库。 此新版本对以前的版本进行了重大变更。 如果应用有任何文档、操作或架构转换器,这些重大更改可能会影响应用。

最重要的变化之一是,OpenApiAny 类已被删除,以支持直接使用 JsonNode。 使用 OpenApiAny 的转换器需要更新为使用 JsonNode。 以下差异显示架构转换器从 .NET 9 到 .NET 10 的更改:

options.AddSchemaTransformer((schema, context, cancellationToken) =>
{
    if (context.JsonTypeInfo.Type == typeof(WeatherForecast))
    {
-       schema.Example = new OpenApiObject
+       schema.Example = new JsonObject
        {
-           ["date"] = new OpenApiString(DateTime.Now.AddDays(1).ToString("yyyy-MM-dd")),
+           ["date"] = DateTime.Now.AddDays(1).ToString("yyyy-MM-dd"),
-           ["temperatureC"] = new OpenApiInteger(0),
+           ["temperatureC"] = 0,
-           ["temperatureF"] = new OpenApiInteger(32),
+           ["temperatureF"] = 32,
-           ["summary"] = new OpenApiString("Bracing"),
+           ["summary"] = "Bracing",
        };
    }
    return Task.CompletedTask;
});

请注意,即使仅将 OpenAPI 版本连接到 3.0,这些更改也是必需的。

Yaml 中的 OpenAPI

ASP.NET 现在支持以 YAML 格式提供生成的 OpenAPI 文档。 YAML 比 JSON 更简洁,当可以推断出大括号和引号时,它消除了这些。 YAML 还支持多行字符串,这对于长说明很有用。

若要将应用配置为以 YAML 格式提供生成的 OpenAPI 文档,请使用“.yaml”或“.yml”后缀在 MapOpenApi 调用中指定终结点,如以下示例所示:

app.MapOpenApi("/openapi/{documentName}.yaml");

支持:

  • YAML 目前仅适用于从 OpenAPI 终结点提供服务的 OpenAPI。
  • 将来会在预览版中增加在构建时以 YAML 格式生成 OpenAPI 文档的功能。

请参阅此 PR,它添加了对以 YAML 格式提供生成的 OpenAPI 文档的支持。

对 ProducesResponseType 的响应说明

ProducesAttributeProducesResponseTypeAttributeProducesDefaultResponseType 属性现在接受可选字符串参数 Description,该参数将设置响应的说明。 下面是一个示例:

[HttpGet(Name = "GetWeatherForecast")]
[ProducesResponseType<IEnumerable<WeatherForecast>>(StatusCodes.Status200OK, Description = "The weather forecast for the next 5 days.")]
public IEnumerable<WeatherForecast> Get()
{

生成的 OpenAPI:

        "responses": {
          "200": {
            "description": "The weather forecast for the next 5 days.",
            "content": {

社区贡献Sander ten Brinke

身份验证和授权

本部分介绍身份验证和授权的新功能。

杂项

本部分介绍 ASP.NET Core 10.0 中的其他新功能。

更好地支持通过顶层语句来测试应用程序

.NET 10 现在更好地支持使用 顶级语句的测试应用。 以前,开发人员必须手动将 public partial class Program 添加到 Program.cs 文件,以便测试项目可以引用 Program classpublic partial class Program 是必需的,因为 C# 9 中的顶级语句特性功能了一个 Program class,它被声明为内部

在 .NET 10 中,源生成器 用于生成 public partial class Program 声明(如果程序员未显式声明)。 此外,还添加了一个分析器来检测何时显式声明 public partial class Program,并建议开发人员将其删除。

图像

以下 PR 为此功能做出了贡献:

使用 RedirectHttpResult.IsLocalUrl 检测 URL 是否为本地

使用新的 RedirectHttpResult.IsLocalUrl(url) 辅助方法检测一个 URL 是否为本地。 如果满足以下条件,则 URL 被视为本地 URL:

使用 虚拟路径"~/" 的 URL 也是本地的。

IsLocalUrl 可用于在重定向之前验证 URL,以防止开放重定向攻击

if (RedirectHttpResult.IsLocalUrl(url))
{
    return Results.LocalRedirect(url);
}

@martincostello,感谢你的贡献!