共用方式為


ASP.NET Core 10.0 的新功能

本文強調 ASP.NET Core 10.0 中最重要的變更,其中包含相關文件的連結。

隨著提供新的預覽版本,本文將會更新。 請參閱 Asp.Net Core 公告頁面,直到此頁面更新為止。

Blazor

本節說明 Blazor的新功能。

QuickGrid RowClass 參數

使用新的 RowClass 參數,根據行項目,將樣式表類別套用到網格的行。 在下列範例中,每一列都會呼叫 GetRowCssClass 方法,根據列中的項目條件來套用樣式類別:

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

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

如需詳細資訊,請參閱 ASP.NET Core Blazor 'QuickGrid' 元件

將 Blazor 腳本作為靜態網頁資產

在舊版 .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 檔中會看到的一些變更包括:

  • 可空的類型在模型中不再具有 nullable: true 屬性。
  • 它們沒有 nullable: true 屬性,而是具有 type 關鍵詞,其值為陣列,其中包含 null 作為其中一種類型。

使用這項功能時,所產生檔案的預設 OpenAPI 版本會3.1。 您可以在 AddOpenApi 委派參數中,明確設定 configureOptionsOpenApiVersion 屬性來變更版本。

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

在建置時產生 OpenAPI 檔時,您可以在 msBuild 項目中設定 --openapi-versionOpenApiGenerateDocumentsOptions,以選取 OpenAPI 版本。

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

在下列 PR中,已初步新增 OpenAPI 3.1 支援。

OpenAPI 3.1 重大變更

OpenAPI 3.1 的支援需要更新基礎 OpenAPI.NET 程式庫到新的主要版本 2.0。 這個新版本與舊版本相比有一些重大變更。 重大變更可能會影響那些包含任何文件、操作或架構轉換器的應用程式。

其中一項最重要的變更是,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,該 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 class。 要求 public partial class Program,是因為 C# 9 的最上層語句功能會產生一個被宣告為 internalProgram 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 此貢獻!