【譯】.NET 7 預覽版 1 中的 ASP.NET Core 更新


原文 | 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 客戶端源生成器:

[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) 。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM