[翻译] ASP.NET Core 3.0 的新增功能
全文翻譯自微軟官方文檔英文版?What's new in ASP.NET Core 3.0
本文重點介紹了 ASP.NET Core 3.0 中最重要的更改,并提供相關文檔的連接。
Blazor
Blazor 是 ASP.NET Core 中的一個新的框架,用于使用 .NET 構建交互式的客戶端 Web UI:
使用 C# 而不是 JavaScript 創(chuàng)建豐富的交互式 UI。
共享用 .NET 編寫的服務器端和客戶端應用程序邏輯。
將 UI 渲染為 HTML 和 CSS,以提供廣泛的瀏覽器支持,包括移動瀏覽器。
Blazor 框架支持的場景:
可重用的 UI 組件(Razor 組件)
客戶端路由
組件布局
對依賴注入的支持
表單與驗證
使用 Razor 類庫構建組件庫
JavaScript 互操作
有關更多信息,請參閱:ASP.NET Core 中的 Blazor 簡介。
Blazor Server
Blazor 將組件渲染邏輯與 UI 更新的邏輯進行了解耦。Blazor Server 支持在服務器上的 ASP.NET Core 應用程序中承載 Razor 組件。UI 的更新通過一個 SignalR 連接進行處理。Blazor Server 在 ASP.NET Core 3.0 中受支持。
Blazor WebAssembly (預覽)
Blazor 應用程序也可以使用基于 WebAssembly 的 .NET 運行時直接在瀏覽器中運行。Blazor WebAssembly 在 ASP.NET Core 3.0 中處于預覽狀態(tài),且不受支持。未來的 ASP.NET Core 版本將支持 Blazor WebAssembly。
Razor 組件
Blazor 應用程序是由組件 (components) 構建而成的。組件是自包含的用戶界面元素,例如頁面、對話框或者表單等。組件是普通的 .NET 類,用于定義 UI 呈現(xiàn)邏輯和客戶端事件處理程序。您可以創(chuàng)建沒有 JavaScript 的富交互式 Web 應用程序。
Blazor 中的組件通常使用 Razor 語法編寫,它是 HTML 和 C# 的自然融合。Razor 組件與 Razor Pages(頁面)和 MVC 視圖 (view) 相似,因為它們都使用 Razor。與基于“請求-響應”模型的頁面與視圖不同,組件專門用于處理 UI 合成。
gRPC
gRPC:
是一種流行的高性能 RPC(遠程過程調用)框架。
為 API 開發(fā)提供了一種“契約優(yōu)先“的方式。
使用各種現(xiàn)代的技術,例如:
通過 HTTP/2 傳輸
使用 Protocol Buffers 作為接口描述語言
二進制序列化格式
提供以下功能:
身份驗證
雙向的數(shù)據(jù)流與流程控制
取消與超時
ASP.NET Core 3.0 中的 gRPC 功能包括:
Grpc.AspNetCore?— 一個用于承載 gRPC 服務的 ASP.NET Core 框架。ASP.NET Core 上的 gRPC 能夠與日志記錄、依賴注入 (DI) 身份驗證和授權等標準的 ASP.NET Core 功能集成在一起。
Grpc.Net.Client?— 一個面向 .NET Core,構建在?HttpClient?上的 gRPC 客戶端。
Grpc.Net.ClientFactory?— 用于將 gRPC 客戶端與?HttpClientFactory?集成。
有關更多信息,參見:ASP.NET Core 上 gRPC 的簡介
SignalR
請參見更新 Signal 代碼以獲取遷移說明。SignalR 現(xiàn)在使用?System.Text.Json?來序列化/反序列化 JSON 消息。有關還原為基于?Newtonsoft.Json?的序列化程序的說明,請參閱切換到 Newtonsoft.Json。
在 SignalR 的 JavaScript 和 .NET 客戶端中,添加了對自動重新連接的支持。默認情況下,客戶端嘗試自動重新連接,并在 2, 10 和 30 秒后(如有必要)重試。如果客戶端成功重新連接,它將受到一個新的連接 ID。自動重新連接是選擇性加入的:
const connection = new signalR.HubConnectionBuilder().withUrl("/chatHub").withAutomaticReconnect().build();可以通過傳遞基于毫秒的持續(xù)時間數(shù)組來指定重新連接間隔:
.withAutomaticReconnect([0, 3000, 5000, 10000, 15000, 30000])可以傳入自定義實現(xiàn)以完全控制重新連接間隔。
如果在上次重新連接間隔之后重新連接失敗,則:
客戶端認為連接已離線。
客戶端停止嘗試重新連接。
為了在連接中斷時提供 UI 反饋,SignalR 客戶端 API 已擴展為包括以下事件處理程序:
onreconnecting: 為開發(fā)人員提供了禁用 UI 或告知用戶該應用程序處于脫機狀態(tài)的機會。
onreconnected: 重新建立連接后,使開發(fā)人員有機會更新 UI。
以下代碼在嘗試連接時使用?onreconnecting?更新 UI:
connection.onreconnecting((error) => {const status = `Connection lost due to error "${error}". Reconnecting.`;document.getElementById("messageInput").disabled = true;document.getElementById("sendButton").disabled = true;document.getElementById("connectionStatus").innerText = status; });以下代碼在連接恢復時使用?onreconnected?更新 UI:
connection.onreconnected((connectionId) => {const status = `Connection reestablished. Connected.`;document.getElementById("messageInput").disabled = false;document.getElementById("sendButton").disabled = false;document.getElementById("connectionStatus").innerText = status; });當 hub 方法需要授權時,SignalR 3.0 及更高版本為授權處理程序提供自定義資源。該資源是?HubInvocationContext?的實例。HubInvocationContext?包括:
HubCallerContext
正在調用的 hub 方法的名稱。
hub 方法的參數(shù)。
考慮以下聊天室應用程序示例,該應用程序允許通過 Azure Active Directory 進行多個組織登錄。具有 Microsoft 賬戶的任何人都可以登錄聊天,但只有所屬組織的成員可以禁止用戶或查看用戶的聊天記錄。該應用可以限制特定用戶的某些功能。
public class DomainRestrictedRequirement :AuthorizationHandler<DomainRestrictedRequirement, HubInvocationContext>,IAuthorizationRequirement {protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,DomainRestrictedRequirement requirement,HubInvocationContext resource){if (context.User?.Identity?.Name == null){return Task.CompletedTask;}if (IsUserAllowedToDoThis(resource.HubMethodName,context.User.Identity.Name)){context.Succeed(requirement);}return Task.CompletedTask;}private bool IsUserAllowedToDoThis(string hubMethodName, string currentUsername){if (hubMethodName.Equals("banUser",StringComparison.OrdinalIgnoreCase)){return currentUsername.Equals("bob42@jabbr.net",StringComparison.OrdinalIgnoreCase);}return currentUsername.EndsWith("@jabbr.net",StringComparison.OrdinalIgnoreCase));} }在前面的代碼中,DomainRestrictedRequirement?用作自定義?IAuthorizationRequirement。由于傳遞了?HubInvocationContext?資源,因此內部邏輯可以:
檢查正在調用 hub 的上下文。
決定是否允許用戶執(zhí)行特定的 hub 方法。
可以使用策略名稱來修飾各個 hub 方法,代碼會在運行時進行檢查。當客戶端嘗試調用各個 hub 方法時,DomainRestrictedRequirement?處理程序將會運行并控制對方法的訪問。基于?DomainRestrictedRequirement?控制訪問的方式:
所有已登錄用戶都可以調用?SendMessage?方法。
只有使用?@jabbr.net?電子郵件地址登錄的用戶才能查看用戶的歷史記錄。
只有?bob42@jabbr.net?可以禁止用戶進入聊天室。
創(chuàng)建?DomainRestricted?策略可能涉及:
在?Startup.cs?中添加新策略。
將自定義的?DomainRestrictedRequirement?需求作為參數(shù)提供。
使用授權中間件注冊?DomainRestricted。
SignalR hub 使用終結點路由. SignalR hub 連接先前已顯式地完成:
app.UseSignalR(routes => {routes.MapHub<ChatHub>("hubs/chat"); });在以前的版本中,開發(fā)人員需要在各個不同的位置啟用控制器、Razor 頁面和 SignalR hub。顯式的連接導致一系列幾乎相同的路由片段:
app.UseSignalR(routes => {routes.MapHub<ChatHub>("hubs/chat"); });app.UseRouting(routes => {routes.MapRazorPages(); });SignalR 3.0 hub 可以通過終結點路由進行路由。使用終結點路由,通常可以在?UseRouting?中配置所有的路由:
app.UseRouting(routes => {routes.MapRazorPages();routes.MapHub<ChatHub>("hubs/chat"); });ASP.NET Core 3.0 SignalR 添加了:
客戶端到服務器的流。通過客戶端到服務器的流傳輸,服務器端方法可以采用?IAsyncEnumerable<T>或者?ChannelReader<T>?的實例。在以下 C# 實例中,hub 上的?UploadStream?方法將從客戶端接收字符串流:
public async Task UploadStream(IAsyncEnumerable<string> stream) {await foreach (var item in stream){} }.NET 客戶端應用程序可以將一個?IAsyncEnumerable<T>?或者?ChannelReader<T>?的實例作為上述?UploadStream?hub 方法的?stream?參數(shù)進行傳遞。
在?for?循環(huán)完成,且本地函數(shù)退出之后,將流完成發(fā)送(After the?for?loop has completed and the local function exits, the stream completion is sent):
async IAsyncEnumerable<string> clientStreamData() {for (var i = 0; i < 5; i++){var data = await FetchSomeData();yield return data;} }await connection.SendAsync("UploadStream", clientStreamData());JavaScript 客戶端應用將 SignalR?Subject?(或者一個?RxJS Subject) 用于上述?UploadStream?hub 方法的?stream?參數(shù)。
let subject = new signalR.Subject(); await connection.send("StartStream", "MyAsciiArtStream", subject);當 JavaScript 代碼捕獲到字符串并準備將其發(fā)送到服務器時,它可以使用?subject.next?方法來處理字符串。
subject.next("example"); subject.complete();使用類似前面兩個代碼段的代碼,可以創(chuàng)建實時流式傳輸體驗。
新的 JSON 序列化
現(xiàn)在默認情況下,ASP.NET Core 3.0 使用?System.Text.Json?進行 JSON 序列化:
異步讀取和寫入 JSON。
針對 UTF-8 文本進行了優(yōu)化。
通常會比?Newtonsoft.Json?具有更高的性能。
要將 Json.NET 添加到 ASP.NET Core 3.0 請參閱添加基于 Newtonsoft.Json 的 JSON 格式支持。
新的 Razor 指令
以下列表包含了新的 Razor 指令:
@attribute?—?@attribute?指令將給定屬性應用于生成頁面或者視圖的類。例如:@attribute [Authorize]。
@implements?—?@implements?指令為生成的類實現(xiàn)一個接口。例如:@implements IDisposable。
證書與 Kerberos 身份驗證
證書身份驗證要求:
配置服務器以接收證書。
在?Startup.Configure?中添加身份驗證中間件。
在?Startup.ConfigureServices?中添加證書身份驗證服務。
證書身份驗證的選項 (Options) 提供以下功能:
接受自簽名證書。
檢查證書吊銷。
檢查提供的證書是否具有正確的使用標志。
默認的用戶主體 (user principal) 是根據(jù)證書屬性構建的。用戶主體包含一個事件。通過相應該事件,可以補充或者替換該主體。有關更多信息,請參見在 ASP.NET Core 中配置證書身份驗證。
Windows 身份驗證?已擴展到了 Linux 和 macOS 上。在以前的版本中,Windows 身份驗證僅限于?IIS?和?HttpSys。在 ASP.NET Core 3.0 中,Kestrel 能夠在 Windows, Linux 和 macOS 上為加入了 Windows 域的主機使用 Negotiate(協(xié)商), Kerberos?和?NTLM。Kestrel 對這些身份驗證架構的支持由?Microsoft.AspNetCore.Authentication.Negotiate NuGet?包提供。與其他身份驗證服務一樣,在用用程序范圍內配置身份驗證,然后配置服務:
public void ConfigureServices(IServiceCollection services) {services.AddAuthentication(NegotiateDefaults.AuthenticationScheme).AddNegotiate();}public void Configure(IApplicationBuilder app, IHostingEnvironment env) {app.UseAuthentication();}主機要求:
Windows 主機必須將服務主體名稱?(SPN) 添加到承載該應用程序的用戶賬戶中。
Linux 和 macOS 主機必須加入域。
必須為 Web 進程創(chuàng)建 SPN。
必須在主機上生成和配置密鑰表文件。
有關更多信息,請參見在 ASP.NET Core 中配置 Windows 身份驗證。
模板變更
Web UI 模板(Razor Pages, 帶有控制器和視圖的 MVC)已刪除以下內容:
“Cookie 同意” UI 不再包含在內。若要在 ASP.NET Core 3.0 模板生成的應用程序中啟用“Cookie 同意”功能,請參閱?ASP.NET Core 中的常規(guī)數(shù)據(jù)保護法規(guī) (GDPR) 支持。
現(xiàn)在,腳本和相關的靜態(tài)資產被作為本地文件引用,而不再使用 CDN。有關更多信息,請參見腳本和相關的靜態(tài)資產現(xiàn)在被作為本地文件引用而不再使用 CDN (aspnet/AspNetCore.Docs #14350)。
Angular 模板已更新為使用 Angular 8。
默認情況下,Razor 類庫 (RCL) 模板默認為用于 Razor 組件開發(fā)。Visual Studio 中新的模板選項為頁面和視圖提供模板支持。在命令行中從模板創(chuàng)建 RCL 時,請傳入?-support-pages-and-views?選項 (dotnet new razorclasslib -support-pages-and-views)。
通用主機
ASP.NET Core 3.0 模板使用?.NET 通用主機。以前的版本使用?WebHostBuilder。使用 .NET Core 通用主機(HostBuilder),可以更好地將 ASP.NET Core 應用程序與其他非特定與 Web 的服務器方案集成。有關更多信息,請參見?HostBuilder 替換 WebHostBuilder。
主機配置
在發(fā)布 ASP.NET Core 3.0 之前,帶有?ASPNETCORE_?前綴的環(huán)境變量會被加載,用于 Web 主機的主機配置。在 3.0 中,AddEvironmentVariables?用于加載帶有?DOTNET_?以前追的環(huán)境變量,以使用?CreateDefaultBuilder?進行主機配置。
Startup 構造函數(shù)注入的更改
通用主機僅支持一下類型的?Startup?構造函數(shù)注入:
IHostEnvironment
IWebHostEnvironment
IConfiguration
仍然可以將所有服務以參數(shù)的形式直接注入?Startup.Configure?方法,參見?通用主機限制 Startup 構造函數(shù)注入 (aspnet/Announcements #353).
Kestrel
為了遷移到通用主機,Kestrel 配置已更新。在 3.0 中,Kestrel 在?ConfigureWebHostDefaults?提供的 Web 主機構建器 (host builder) 上進行配置。
連接適配器 (Connection Adapter) 已從 Kestrel 中刪除,并由連接中間件代替 (Connection Middleware)。該中間件類似于 ASP.NET Core 管道中的 HTTP 中間件,但用于較低級別的連接。
Kestrel 傳輸層已在?Connections.Abstractions?中作為公共接口公開。
標頭 (header) 和尾部 (trailer) 之間的歧義已通過將尾部標頭 (trailing header) 移動到新的集合來解決。
同步 IO API(例如?HttpRequest.Body.Read)是引起線程饑餓進而導致程序崩潰的常見原因。在 3.0 中,默認情況下?AllowSynchronousIO?被禁用。
有關更多信息,請參見Kestrel - 從 ASP.NET Core 2.2 遷移到 3.0。
默認啟用 HTTP/2
默認情況下,Kestrel 中為 HTTPS 端點啟用了 HTTP/2。當操作系統(tǒng)支持時,對 IIS 或者 HTTP.sys 的 HTTP/2 的支持將被啟用。
請求計數(shù)器
Hosting EventSource (Microsoft.AspNetCore.Hosting) 發(fā)出與傳入請求有關的以下 EventCounter:
requests-per-second
total-requests
current-requests
failed-requests
終結點路由
終結點路由得到了增強,該路由使各種框架(例如 MVC)可以與中間件更好地協(xié)同工作:
中間件和終結點的順序可以在?Startup.Configure?的請求處理管道中進行配置。
終結點和中間件與其他基于 ASP.NET Core 的技術(例如運行狀況檢查)進行良好的編排。
終結點可以在中間件和 MVC 中實現(xiàn)各種策略,例如 CORS 或者授權等。
過濾器和特性 (attribute) 可以被放置在控制器的方法上。
有關更多信息,請參見?ASP.NET Core 中的路由。
運行狀況檢查
運行狀況檢查通過通用主機使用終結點路由。在?Startup.Configure?中,使用終結點 URL 或者相對路徑,在終結點構建器上調用?MapHealthChecks:
app.UseEndpoints(endpoints => {endpoints.MapHealthChecks("/health"); });運行狀況檢查終結點可以:
指定一個或多個允許的主機/端口。
要求授權。
要求 CORS。
有關更多信息,請參見以下文章:
運行狀況檢查 - 從 ASP.NET Core 2.2 遷移到 3.0
ASP.NET Core 中的運行狀況檢查
HttpContext 上的管道
現(xiàn)在可以使用?System.IO.Pipelines?API 讀取請求正文并寫入響應正文。HttpRequest.BodyReader?屬性提供了一個?PipeReader,可以用于讀取請求正文;HttpResponse.BodyWriter?屬性提供了一個?PipeWriter,可以用于寫入響應正文。HttpRequest.BodyReader?是?HttpRequest.Body?流的相似物;?HttpResponse.BodyWriter?是?HttpResponse.Body?流的相似物。
IIS 中改進了的錯誤報告
現(xiàn)在,在 IIS 中托管 ASP.NET Core 應用程序時的啟動錯誤會生成更豐富的診斷數(shù)據(jù)。這些錯誤會在適用的情況下使用堆棧跟蹤,報告給 Windows 事件日志。此外,所有的警告、錯誤和未處理的異常,都會記錄到 Windows 事件日志中。
服務角色服務和輔助角色 SDK
.NET Core 3.0 引入了新的輔助角色服務 (Worker Service) 應用模板。該模板是在 .NET Core 中編寫長時間運行的服務的起點。
有關更多信息,請參見:
作為 Windows 服務運行的 .NET Core 輔助角色 (.NET Core Workers as Windows Services)
在 ASP.NET Core 中使用托管服務實現(xiàn)后臺任務
在 Windows 服務中承載 ASP.NET Core
Forwarded 標頭中間件的改進
在早期版本的 ASP.NET Core 中,應用在部署到 Azure Linux 或者除 IIS 之外的任何反向代理之后,調用?UseHsts?和?UseHttpsRedirection?都是有問題的。轉發(fā) Linux 和非 IIS 反向代理的方案中介紹了以前版本的修復方式。
此場景已在 ASP.NET Core 3.0 中修復。當?ASPNETCORE_FORWARDEDHEADERS_ENABLED?環(huán)境變量設置為?true?時,主機將啟用?Forwarded 標頭中間件。在 ASP.NET Core 的容器鏡像中,ASPNETCORE_FORWARDEDHEADERS_ENABLED?已被設置為?true。
性能提升
ASP.NET Core 3.0 包括許多改進,可以減少內存使用并提高吞吐量:
在將內置的依賴注入容器用于 scoped 服務時,減少內存的使用量。
減少整個框架的內存分配,包括中間件的各類場景和路由。
減少 WebSocket 連接的內存使用量。
減少 HTTPS 連接的內存使用量,并提高吞吐量。
新的、經過優(yōu)化的、完全異步的 JSON 序列化器。
減少表單 (form) 解析的內存使用量,并提高吞吐量。
ASP.NET Core 3.0 僅可在 .NET Core 3.0 上運行
從 ASP.NET Core 3.0開始,.NET Framework 不再是受支持的目標框架。以 .NET Framework 為目標的項目可以繼續(xù)通過使用?.NET Core 2.1 LTS 版本在完全受支持的狀態(tài)下運行。絕大多數(shù)與 ASP.NET Core 2.1.x 相關的軟件包,都將在 .NET Core 2.1 的三年長期支持期內獲得支持。(Most ASP.NET Core 2.1.x related packages will be supported indefinitely, beyond the 3 year LTS period for .NET Core 2.1.)
有關遷移的更多信息,請參見?將代碼從 .NET Framework 移植到 .NET Core。
使用 ASP.NET Core 共享框架
Microsoft.AspNetCore.App 元包中包含的 ASP.NET Core 3.0 共享框架 (shared framework) 不再需要項目文件中的顯式?<PackageReference />?元素。在項目文件中使用?Microsoft.NET.Sdk.Web?SDK 時,將自動引用共享框架:
<Project Sdk="Microsoft.NET.Sdk.Web">從 ASP.NET Core 共享框架中移除的程序集
從 ASP.NET Core 3.0 共享程序集中移除的最值得注意的程序集是:
Newtonsoft.Json?(Json.NET)。要將 Json.NET 添加到 ASP.NET Core 3.0,請參閱?添加基于 Newtonsoft.Json 的 JSON 格式支持。ASP.NET Core 3.0 引入了?System.Text.Json?來讀寫 JSON。有關更多信息,請參閱本文檔中新的 JSON 序列化。
Entity Framework Core
有關共享框架中所移除程序集的完整列表,請參閱?從 Microsoft.AspNetCore.App 3.0 中移除的程序集。有關進行此修改的動機,更多信息請參閱Microsoft.AspNetCore.App 在 3.0 中的破壞性變更?和?ASP.NET Core 3.0 中的更改初探。
原文鏈接:https://www.cnblogs.com/vxchin/p/whats-new-in-asp-net-core-3-0.html
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總?http://www.csharpkit.com?
總結
以上是生活随笔為你收集整理的[翻译] ASP.NET Core 3.0 的新增功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于Asp.Net Core MVC和A
- 下一篇: .NET Core 3.0稳定版发布