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的 委派參數中,明確設定 configureOptions
的 OpenApiVersion 屬性來變更版本。
builder.Services.AddOpenApi(options =>
{
// Specify the OpenAPI version to use.
options.OpenApiVersion = Microsoft.OpenApi.OpenApiSpecVersion.OpenApi3_0;
});
在建置時產生 OpenAPI 檔時,您可以在 msBuild 項目中設定 --openapi-version
OpenApiGenerateDocumentsOptions
,以選取 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 上的回應描述
ProducesAttribute、ProducesResponseTypeAttribute和 ProducesDefaultResponseType 属性現在接受選擇性字元串參數 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": {
驗證和授權
本節說明驗證和授權的新功能。
雜項
本節說明 ASP.NET Core 10.0 中的其他新功能。
提供更好支援以測試使用最上層語句的應用程式
.NET 10 現在更支持測試使用 最上層語句的應用程式。 前任開發人員必須手動將 public partial class Program
新增至 Program.cs
檔案,讓測試專案可以參考 Program class
。 要求 public partial class Program
,是因為 C# 9 的最上層語句功能會產生一個被宣告為 internal 的 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 此貢獻!