ASP.NET Core 9.0 的新功能

本文會重點說明 ASP.NET Core 9.0 最重要的變更,並附有相關文件的連結。

本文已針對 .NET 9 Preview 3 進行了更新。

Blazor

本章節會說明 Blazor 的新功能。

建構函式插入

Razor 元件支援建構函式插入。

在下列範例中,部份 (code-behind) 類別會使用 主要建構函式 插入 NavigationManager 服務:

public partial class ConstructorInjection(NavigationManager navigation)
{
    protected NavigationManager Navigation { get; } = navigation;
}

如需詳細資訊,請參閱 ASP.NET Core Blazor 相依性插入

互動式伺服器元件的 WebSocket 壓縮

根據預設,互動式伺服器元件會啟用 WebSocket 連線的壓縮,並為 'self' 設定 frame-ancestors內容安全性原則 (CSP) 指示詞組,這只允許將應用程式內嵌在啟用壓縮時或提供 WebSocket 內容的設定時,將應用程式內嵌在來源的 <iframe> 中。

ConfigureWebSocketOptions 設定為 null 可停用壓縮,這可降低 應用程式遭受攻擊的弱點,但可能會導致效能降低:

.AddInteractiveServerRenderMode(o => o.ConfigureWebSocketOptions = null)

使用 'none' 值設定較嚴格的 frame-ancestors CSP (需要單一引用),會允許 WebSocket 壓縮,但會防止瀏覽器將應用程式內嵌至任何 <iframe>:

.AddInteractiveServerRenderMode(o => o.ContentSecurityFrameAncestorsPolicy = "'none'")

如需詳細資訊,請參閱以下資源:

在 Blazor 中處理鍵盤組合事件

新的 KeyboardEventArgs.IsComposing 屬性會指出鍵盤事件是否為組合工作階段的一部分。 追蹤鍵盤事件的組合狀態對於處理國際字元輸入方法至關重要。

SignalR

本章節會說明 SignalR 的新功能。

SignalR 中樞中的多型類型支援

中樞方法現在可以接受基底類別,而不是衍生類別,以啟用多型案例。 基底類型必須 加上註解才能允許多型

public class MyHub : Hub
{
    public void Method(JsonPerson person)
    {
        if (person is JsonPersonExtended)
        {
        }
        else if (person is JsonPersonExtended2)
        {
        }
        else
        {
        }
    }
}

[JsonPolymorphic]
[JsonDerivedType(typeof(JsonPersonExtended), nameof(JsonPersonExtended))]
[JsonDerivedType(typeof(JsonPersonExtended2), nameof(JsonPersonExtended2))]
private class JsonPerson
{
    public string Name { get; set; }
    public Person Child { get; set; }
    public Person Parent { get; set; }
}

private class JsonPersonExtended : JsonPerson
{
    public int Age { get; set; }
}

private class JsonPersonExtended2 : JsonPerson
{
    public string Location { get; set; }
}

最小 API

本節說明基本 API 的新功能。

已將 InternalServerErrorInternalServerError<TValue> 新增至 TypedResults

TypedResults 類別是從最小 API 傳回強型別 HTTP 狀態碼式回應的實用工具。 TypedResults 現在包含從端點傳回「500 內部伺服器錯誤」回應的 Factory 方法和類型。 以下是傳回 500 回應的範例:

var app = WebApplication.Create();

app.MapGet("/", () => TypedResults.InternalServerError("Something went wrong!"));

app.Run();

驗證與授權

本章節會說明驗證和授權的新功能。

OIDC 和 OAuth 參數自訂

OAuth 和 OIDC 驗證處理程式現在有個 AdditionalAuthorizationParameters 選項,可讓您更輕鬆地自訂通常包含在重新導向查詢字串中的授權訊息參數。 在 .NET 8 和更早版本中,這需要在自訂處理程式中要求自訂 OnRedirectToIdentityProvider 回撥或覆寫 BuildChallengeUrl 方法。 以下是 .NET 8 程式碼的範例:

builder.Services.AddAuthentication().AddOpenIdConnect(options =>
{
    options.Events.OnRedirectToIdentityProvider = context =>
    {
        context.ProtocolMessage.SetParameter("prompt", "login");
        context.ProtocolMessage.SetParameter("audience", "https://api.example.com");
        return Task.CompletedTask;
    };
});

上述範例現在可以簡化為下列程式碼:

builder.Services.AddAuthentication().AddOpenIdConnect(options =>
{
    options.AdditionalAuthorizationParameters.Add("prompt", "login");
    options.AdditionalAuthorizationParameters.Add("audience", "https://api.example.com");
});

設定 HTTP.sys 擴充驗證旗標

您現在可以使用新的 EnableKerberosCredentialCachingCaptureCredentials 屬性在 HTTP.sys AuthenticationManager 上設定 HTTP_AUTH_EX_FLAG_ENABLE_KERBEROS_CREDENTIAL_CACHINGHTTP_AUTH_EX_FLAG_CAPTURE_CREDENTIAL HTTP.sys 旗標,以最佳化 Windows 驗證的處理方式。 例如:

webBuilder.UseHttpSys(options =>
{
    options.Authentication.Schemes = AuthenticationSchemes.Negotiate;
    options.Authentication.EnableKerberosCredentialCaching = true;
    options.Authentication.CaptureCredentials = true;
});

其他

下列章節會說明其他的新功能。

開發人員例外狀況頁面上的端點中繼資料

新增至 MVC 動作、最小 API 和 gRPC 方法的屬性是 端點中繼資料 的範例。 ASP.NET Core 會使用端點中繼資料來控制端點行為,例如路由、驗證和授權、回應快取、速率限制、OpenAPI 產生等等。

.NET 9 會將中繼資料新增至 開發人員例外狀況頁面。 新的中繼資料資訊會出現在 [Routing] 區段中,並會有其他路由資訊。 這項資訊可讓您更輕鬆地在開發期間偵錯 ASP.NET 核心錯誤。 下圖顯示開發人員例外狀況頁面上的新中繼資料資訊:

開發人員例外狀況頁面上的新中繼資料資訊

字典偵錯改善

字典和其他索引鍵/值集合的偵錯顯示已改善版面配置。 索引鍵會顯示在偵錯工具的索引鍵資料行中,而不是與值串連。 下列影像顯示偵錯工具中字典的舊顯示與新顯示。

之前:

先前的偵錯工具體驗

新的偵錯工具體驗

ASP.NET Core 有許多索引鍵/值集合。 這個改良的偵錯體驗會套用至:

  • HTTP 標頭
  • 查詢字串
  • 表單
  • Cookie
  • 檢視資料
  • 路由資料
  • 特性