原文 | Daniel Roth
翻譯 | 鄭子銘
.NET 7 預覽版 1 現已推出!這是 .NET 下一個主要版本的第一個預覽版,其中將包括使用 ASP.NET Core 進行 Web 開發的下一波創新。
在 .NET 7 中,我們計劃對 ASP.NET Core 進行廣泛投資。以下是我們計劃重點關注的一些領域:
- 效能:.NET 6 包含對 ASP.NET Core 的許多效能改進,我們將努力使 ASP.NET Core 在 .NET 7 中更快、更高效。
- HTTP/3:HTTP/3 支援作為 .NET 6 中的預覽功能提供。對於 .NET 7,我們希望完成它並使其成為預設啟用的受支援功能。在未來的預覽版中,您可以期待在我們的 HTTP/3 支援中看到高階 TLS 功能和更多效能改進。
- 最小 API:新增對端點過濾器和路由分組的支援,作為最小 API 的核心原語。通常還簡化 API 的身份驗證和授權配置。
- gRPC:我們正在投資 gRPC JSON 轉碼。此功能允許 gRPC 服務像帶有 JSON 請求和響應的 RESTful HTTP API 一樣被呼叫。
- SignalR:新增對強型別客戶端的支援並從客戶端呼叫返回結果。
- Razor:我們將對 Razor 編譯器進行各種改進,以提高效能、彈性並促進改進的工具。
- Blazor:在完成對 .NET MAUI、WPF 和 Windows 窗體的 Blazor Hybrid 支援後,我們將對 Blazor 進行廣泛的改進,包括:
- 新的 .NET WebAssembly 功能:混合模式 AOT、多執行緒、Web 加密。
- 增強的熱過載支援。
- 資料繫結改進。
- 更靈活的預渲染。
- 更好地控制 Blazor 伺服器電路的生命週期。
- 改進了對微前端的支援。
- MVC:對端點路由、連結生成和引數繫結的改進。
- Orleans:ASP.NET Core 和 Orleans 團隊正在研究進一步調整和整合 Orleans 分散式程式設計模型與 ASP.NET Core 的方法。 Orleans 4 將與 .NET 7 一起釋出,並專注於簡單性、可維護性和效能,包括人類可讀的流標識和新的優化、版本容忍的序列化程式。
有關為 .NET 7 計劃的特定 ASP.NET Core 工作的更多詳細資訊,請參閱 GitHub 上針對 .NET 7 的完整 ASP.NET Core 路線圖。
.NET 7 Preview 1 是眾多 .NET 7 預覽版中的第一個,為 2022 年 11 月的 .NET 7 版本做準備。
我在最近一集 On .NET 中加入了 James Montemagno,以分解 .NET 7 和 .NET 7 中的 ASP.NET Core 中的所有內容:
以下是此預覽版中新增內容的摘要:
- 最小的 API 改進:
- IFormFile 和 IFormFileCollection 支援
- 將請求正文繫結為 Stream 或 PipeReader
- JSON 選項配置
- SignalR 客戶端源生成器
- 支援 MVC 檢視和 Razor 頁面中的可為空模型
- 在驗證錯誤中使用 JSON 屬性名稱
- 改進了 dotnet watch 的控制檯輸出
- 將 dotnet watch 配置為始終重新啟動以進行粗魯的編輯
- 在 ValidationAttribute 中使用依賴注入
- 更快的標頭解析和寫入
- gRPC JSON 轉碼
開始使用
要開始使用 .NET 7 Preview 1 中的 ASP.NET Core,請安裝 .NET 7 SDK。
如果您在 Windows 上使用 Visual Studio,我們建議安裝最新的 Visual Studio 2022 預覽版。 Visual Studio for Mac 對 .NET 7 預覽的支援尚不可用,但即將推出。
要安裝最新的 .NET WebAssembly 構建工具,請從提升的命令提示符處執行以下命令:
dotnet workload install wasm-tools
升級現有專案
要將現有的 ASP.NET Core 應用從 .NET 6 升級到 .NET 7 Preview 1:
- 將您的應用程式的目標框架更新為 net7.0。
- 將所有 Microsoft.AspNetCore.* 包引用更新到 7.0.0-preview.1.*。
- 將所有 Microsoft.Extensions.* 包引用更新到 7.0.0-preview.1.*。
另請參閱 .NET 7 的 ASP.NET Core 中的重大更改的完整列表。
最小的 API 改進
IFormFile 和 IFormFileCollection 支援
您現在可以使用 IFormFile 和 IFormFileCollection 在最少的 API 中處理檔案上傳:
app.MapPost("/upload", async(IFormFile file) =>
{
using var stream = System.IO.File.OpenWrite("upload.txt");
await file.CopyToAsync(stream);
});
app.MapPost("/upload", async (IFormFileCollection myFiles) => { ... });
將此功能與身份驗證一起使用需要防偽支援,但尚未實現。我們的 .NET 7 路線圖包含對最小 API 的防偽支援。當請求包含 Authorization 標頭、客戶端證書或 cookie 標頭時,繫結到 IFormFile 或 IFormFileCollection 當前被禁用。我們將在完成防偽支援工作後立即解決此限制。
感謝 @martincostello 貢獻此功能。
將請求正文繫結為 Stream 或 PipeReader
您現在可以將請求正文繫結為 Stream 或 PipeReader,以有效地支援使用者必須攝取資料並將其儲存到 blob 儲存或將資料排隊到佇列提供程式(Azure 佇列等)以供以後處理的場景工作者或雲功能。以下示例顯示瞭如何使用新繫結:
app.MapPost("v1/feeds", async (QueueClient queueClient, Stream body, CancellationToken cancellationToken) =>
{
await queueClient.CreateIfNotExistsAsync(cancellationToken: cancellationToken);
await queueClient.SendMessageAsync(await BinaryData.FromStreamAsync(body), cancellationToken: cancellationToken);
});
使用 Stream 或 PipeReader 時,需要考慮以下幾點:
- 攝取資料時,Stream 將是與 HttpRequest.Body 相同的物件。
- 預設情況下不緩衝請求正文。讀取正文後,它不可回退(您不能多次讀取流)。
- Stream/PipeReader 在最小操作處理程式之外不可用,因為底層緩衝區將被釋放和/或重用。
JSON 選項配置
我們正在引入一個新的更簡潔的 API,ConfigureRouteHandlerJsonOptions,為最小的 API 端點配置 JSON 選項。這個新的 API 避免了與 Microsoft.AspNetCore.Mvc.JsonOptions 的混淆。
var builder = WebApplication.CreateBuilder(args);
builder.Services.ConfigureRouteHandlerJsonOptions(options =>
{
//Ignore Cycles
options.SerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles;
});
SignalR 客戶端源生成器
感謝@mehmetakbulut 的貢獻,我們為 SignalR 新增了一個新的客戶端源生成器。
SignalR 客戶端源生成器根據您定義的介面生成強型別的傳送和接收程式碼。您可以在客戶端上重用來自強型別 SignalR 集線器的相同介面來代替鬆散型別的 .On("methodName", ...) 方法。同樣,您的集線器可以為其方法實現一個介面,並且客戶端可以使用該相同介面來呼叫集線器方法。
要使用 SignalR 客戶端源生成器:
- 新增對 Microsoft.AspNetCore.SignalR.Client.SourceGenerator 包的引用。
- 將 HubServerProxyAttribute 和 HubClientProxyAttribute 類新增到您的專案中(這部分設計可能會在未來的預覽版中更改):
[AttributeUsage(AttributeTargets.Method)]
internal class HubServerProxyAttribute : Attribute
{
}
[AttributeUsage(AttributeTargets.Method)]
internal class HubClientProxyAttribute : Attribute
{
}
- 為您的專案新增一個靜態分部類,並使用 [HubClientProxy] 和 [HubServerProxy] 屬性編寫靜態分部方法
internal static partial class MyCustomExtensions
{
[HubClientProxy]
public static partial IDisposable ClientRegistration<T>(this HubConnection connection, T provider);
[HubServerProxy]
public static partial T ServerProxy<T>(this HubConnection connection);
}
- 使用程式碼中的部分方法!
public interface IServerHub
{
Task SendMessage(string message);
Task<int> Echo(int i);
}
public interface IClient
{
Task ReceiveMessage(string message);
}
public class Client : IClient
{
// Equivalent to HubConnection.On("ReceiveMessage", (message) => {});
Task ReceiveMessage(string message)
{
return Task.CompletedTask;
}
}
HubConnection connection = new HubConnectionBuilder().WithUrl("...").Build();
var stronglyTypedConnection = connection.ServerProxy<IServerHub>();
var registrations = connection.ClientRegistration<IClient>(new Client());
await stronglyTypedConnection.SendMessage("Hello world");
var echo = await stronglyTypedConnection.Echo(10);
支援 MVC 檢視和 Razor 頁面中的可為空模型
我們啟用了定義一個可為空的頁面或檢視模型來改進在 ASP.NET Core 應用中使用空狀態檢查時的體驗:
@model Product?
在驗證錯誤中使用 JSON 屬性名稱
當模型驗證生成 ModelErrorDictionary 時,預設情況下它將使用屬性名稱作為錯誤鍵(“MyClass.PropertyName”)。模型屬性名稱通常是一個實現細節,這會使它們難以從單頁應用程式中處理。您現在可以將驗證配置為使用相應的 JSON 屬性名稱,而不是使用新的 SystemTextJsonValidationMetadataProvider(或使用 Json.NET 時的 NewtonsoftJsonValidationMetadataProvider)。
services.AddControllers(options =>
{
options.ModelMetadataDetailsProviders.Add(new SystemTextJsonValidationMetadataProvider())
});
改進了 dotnet watch 的控制檯輸出
我們清理了 dotnet watch 的控制檯輸出,以更好地與 ASP.NET Core 的登出保持一致,並在?表情符號?.中脫穎而出。
以下是新輸出的示例:
C:BlazorApp> dotnet watch
dotnet watch ? Hot reload enabled. For a list of supported edits, see https://aka.ms/dotnet/hot-reload.
? Press "Ctrl + R" to restart.
dotnet watch ? Building...
Determining projects to restore...
All projects are up-to-date for restore.
You are using a preview version of .NET. See: https://aka.ms/dotnet-support-policy
BlazorApp -> C:UsersdarothDesktopBlazorAppbinDebugnet7.0BlazorApp.dll
dotnet watch ? Started
info: Microsoft.Hosting.Lifetime[14]
Now listening on: https://localhost:7148
info: Microsoft.Hosting.Lifetime[14]
Now listening on: http://localhost:5041
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
Content root path: C:UsersdarothDesktopBlazorApp
dotnet watch ⌚ File changed: .PagesIndex.razor.
dotnet watch ? Hot reload of changes succeeded.
info: Microsoft.Hosting.Lifetime[0]
Application is shutting down...
dotnet watch ? Shutdown requested. Press Ctrl+C again to force exit.
將 dotnet watch 配置為始終重新啟動以進行粗魯的編輯
通過將 DOTNET_WATCH_RESTART_ON_RUDE_EDIT 環境變數設定為 true,將 dotnet watch 配置為始終在不提示粗魯編輯(無法熱重新載入的編輯)的情況下重新啟動。
將服務注入 Blazor 中的自定義驗證屬性
您現在可以將服務注入 Blazor 中的自定義驗證屬性。 Blazor 將設定 ValidationContext,以便它可以用作服務提供者。
public class SaladChefValidatorAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var saladChef = validationContext.GetRequiredService<SaladChef>();
if (saladChef.ThingsYouCanPutInASalad.Contains(value.ToString()))
{
return ValidationResult.Success;
}
return new ValidationResult("You should not put that in a salad!");
}
}
// Simple class configured as a service for dependency injection
public class SaladChef
{
public string[] ThingsYouCanPutInASalad = { "Strawberries", "Pineapple", "Honeydew", "Watermelon", "Grapes" };
}
感謝@MariovanZeist 的貢獻!
更快的標頭解析和寫入
我們對 HTTP/2 和 HTTP/3 的標頭解析和寫入效能進行了多項改進。有關詳細資訊,請參閱以下拉取請求:
gRPC JSON 轉碼
gRPC JSON 轉碼允許 gRPC 服務像 RESTful HTTP API 一樣使用。配置完成後,gRPC JSON 轉碼允許您使用熟悉的 HTTP 概念呼叫 gRPC 方法:
- HTTP 動詞
- URL引數繫結
- JSON 請求/響應
當然 gRPC 也可以繼續使用。用於 gRPC 服務的 RESTful API。沒有重複!
ASP.NET Core 使用名為 gRPC HTTP API 的庫對此功能提供實驗性支援。對於 .NET 7,我們計劃將此功能作為 ASP.NET Core 的受支援部分。此功能尚未包含在 .NET 7 中,但您可以試用現有的實驗包。有關更多資訊,請參閱 gRPC HTTP API 入門文件。
給予反饋
我們希望您喜歡 .NET 7 中的 ASP.NET Core 預覽版,並且您對我們的 .NET 7 路線圖和我們一樣興奮!我們很想聽聽您對此版本的體驗以及您對路線圖的看法。通過在 GitHub 上提交問題並評論路線圖問題,讓我們知道您的想法。
感謝您試用 ASP.NET Core!
原文連結
ASP.NET Core updates in .NET 7 Preview 1
本作品採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。
歡迎轉載、使用、重新發布,但務必保留文章署名 鄭子銘 (包含連結: http://www.cnblogs.com/MingsonZheng/ ),不得用於商業目的,基於本文修改後的作品務必以相同的許可釋出。
如有任何疑問,請與我聯絡 (MingsonZheng@outlook.com) 。