在 .NET 6 Preview 3 ASP.NET Core 更新
.NET 6 Preview 3現(xiàn)在可用了,其中包括對(duì)ASP.NET Core的許多重大改進(jìn)。
這是此預(yù)覽版本中的新增功能:
更小的SignalR,Blazor Server和MessagePack scripts
啟用 Redis 分析會(huì)話
HTTP/3 endpoint TLS配置
初版的 .NET Hot Reload 支持
Razor編譯器不再產(chǎn)生單獨(dú)的Views程序集
IIS中的 Shadow-copy
SignalR C ++客戶端的 Vcpkg 移植
減少了空閑TLS連接的內(nèi)存占用
從 SlabMemoryPool 中移除 slabs
WPF和WindowsForm 中的 BlazorWebView 控件
開(kāi)始吧
要在.NET 6 Preview 3中開(kāi)始使用ASP.NET Core,請(qǐng)安裝.NET 6 SDK。
如果您使用的是Windows上的Visual Studio,建議安裝Visual Studio 2019 16.10的最新預(yù)覽版。如果您使用的是macOS,我們建議安裝Visual Studio 2019 for Mac 8.10的最新預(yù)覽版。
升級(jí)現(xiàn)有項(xiàng)目
要將現(xiàn)有的ASP.NET Core應(yīng)用程序從.NET 6 Preview 2升級(jí)到.NET 6 Preview 3:
將所有 Microsoft.AspNetCore.* 軟件包引用更新為。6.0.0-preview.3.*
將所有 Microsoft.Extensions.* 軟件包引用更新為。6.0.0-preview.3.*
請(qǐng)參閱ASP.NET Core for .NET 6中的重大更改的完整列表。
較小的SignalR,Blazor Server和MessagePack腳本
多虧了Ben Adams的社區(qū)貢獻(xiàn),SignalR,MessagePack和Blazor Server腳本現(xiàn)在大大縮小了,下載量更小,瀏覽器更少的JavaScript解析和編譯以及更快的啟動(dòng)速度。
這項(xiàng)工作減少了下載大小,這是非常驚人的:
| signalr.min.js | 130 KB | 39 KB | 70% | 10 KB |
| blazor.server.js | 212 KB | 116 KB | 45% | 28 KB |
現(xiàn)在用于MessagePack的軟件包您還只需要使用 @microsoft/signalr-protocol-msgpack即可,無(wú)需引入msgpack5。這意味著你只需要一個(gè)額外的29 KB,而不是早先使用MessagePack 代替 JSON 的140 KB
縮小尺寸的方法如下:
將TypeScript和依賴項(xiàng)更新到最新版本。
從uglify-js切換到terser,這是webpack的默認(rèn)設(shè)置,并支持更新的JavaScript語(yǔ)言功能(如class)。
將SignalR模塊標(biāo)記為"sideEffects": false,這對(duì)于搖樹(shù)優(yōu)化更有效。
放棄"es6-promise/dist/es6-promise.auto.js"polyfill。
將TypeScript更改為輸出es2019而不是輸出es5,并放棄了“ es2015.promise”和“ es2015.iterable” polyfill。
從@msgpack/msgpack移至msgpack5,因?yàn)樗枰^少的polyfill,并且對(duì)TypeScript和模塊更友好。
您可以在GitHub上的 Ben 的pull request找到有關(guān)這些更改的更多詳細(xì)信息。
啟用Redis分析會(huì)話
我們接受了Gabriel Lucaci的社區(qū)貢獻(xiàn),以在此預(yù)覽中啟用與Microsoft.Extensions.Caching.StackExchangeRedis的Redis分析會(huì)話。有關(guān)Redis分析的更多詳細(xì)信息,請(qǐng)參見(jiàn)官方文檔。該API可以按以下方式使用:
services.AddStackExchangeRedisCache(options?=> {options.ProfilingSession?=?()?=>?new?ProfilingSession(); })HTTP / 3端點(diǎn)TLS配置
.NET 6對(duì)HTTP / 3的支持的工作開(kāi)始加強(qiáng)。HTTP/ 3與現(xiàn)有的HTTP協(xié)議相比,具有許多優(yōu)點(diǎn),包括更快的連接建立和改進(jìn)的低質(zhì)量網(wǎng)絡(luò)性能。
此預(yù)覽中的新增功能是使用可以在單個(gè)HTTP / 3端口上配置TLS證書(shū)UseHttps。這使Kestrel的HTTP / 3端點(diǎn)配置與HTTP / 1.1和HTTP / 2保持一致。
.ConfigureKestrel((context,?options)?=> {options.EnableAltSvc?=?true;options.Listen(IPAddress.Any,?5001,?listenOptions?=>{listenOptions.Protocols?=?HttpProtocols.Http3;listenOptions.UseHttps(httpsOptions?=>{httpsOptions.ServerCertificate?=?LoadCertificate();});}); })初版的.NET Hot Reload支持
現(xiàn)在,使用.NET的ASP.NET Core&Blazor項(xiàng)目可以使用.NET Hot Reload的早期支持dotnet watch。.NET Hot Reload會(huì)將代碼更改應(yīng)用于正在運(yùn)行的應(yīng)用程序,而無(wú)需重新啟動(dòng)它,也不會(huì)丟失應(yīng)用程序狀態(tài)。
要嘗試對(duì)基于.NET 6的現(xiàn)有ASP.NET Core項(xiàng)目進(jìn)行熱重裝,請(qǐng)將屬性添加到launchSettings.json中的啟動(dòng)配置文件中。對(duì)于Blazor WebAssembly項(xiàng)目,請(qǐng)使用熱重載配置文件。"hotReloadProfile": "aspnetcore"``"blazorwasm"
使用運(yùn)行項(xiàng)目dotnet watch。輸出應(yīng)指示已啟用熱重裝:
watch?:?Hot?reload?enabled.?For?a?list?of?supported?edits,?see?https://aka.ms/dotnet/hot-reload.?Press?"Ctrl?+?R"?to?restart.如果您想在任何時(shí)候強(qiáng)制應(yīng)用程序重新生成并重新啟動(dòng),則可以通過(guò)Ctrl+R在控制臺(tái)上輸入來(lái)執(zhí)行此操作。
您現(xiàn)在可以開(kāi)始對(duì)代碼進(jìn)行編輯。保存代碼更改時(shí),適用的更改幾乎立即自動(dòng)熱加載到正在運(yùn)行的應(yīng)用程序中。正在運(yùn)行的應(yīng)用程序中的所有應(yīng)用程序狀態(tài)都將保留。
hot-reload您也可以將更改熱加載到CSS文件中,而無(wú)需刷新瀏覽器:
css-hot-reload.NET Hot Reload不支持某些代碼更改。您可以在docs中找到受支持的代碼編輯列表。對(duì)于Blazor WebAssembly,當(dāng)前僅支持方法主體替換。我們正在努力擴(kuò)展.NET 6中受支持的編輯集。當(dāng)dotnet watch檢測(cè)到無(wú)法使用熱重載應(yīng)用的更改時(shí),它會(huì)退回到重建和重新啟動(dòng)應(yīng)用程序的狀態(tài)。
這只是.NET 6中熱重載支持的開(kāi)始。在即將發(fā)布的預(yù)覽中以及在Visual Studio中集成熱重載后,將很快提供對(duì)桌面和移動(dòng)應(yīng)用程序的熱重載支持。
Razor編譯器不再產(chǎn)生單獨(dú)的Views程序集
Razor編譯器以前利用兩步編譯過(guò)程生成了一個(gè)單獨(dú)的Views程序集,其中包含在應(yīng)用程序中定義的生成的視圖和頁(yè)面(.cshtml)。生成的類(lèi)型是公共的,并且在AspNetCore名稱空間下。
現(xiàn)在,我們更新了Razor編譯器,以將視圖和頁(yè)面類(lèi)型構(gòu)建到主項(xiàng)目程序集中。現(xiàn)在,默認(rèn)情況下會(huì)像在AspNetCoreGeneratedDocument命名空間中一樣生成internal sealed這些類(lèi)型。此更改提高了構(gòu)建性能,啟用了單個(gè)文件部署,并使這些類(lèi)型可以參與.NET Hot Reload。
有關(guān)此更改的更多詳細(xì)信息,請(qǐng)參閱GitHub上的相關(guān)公告。
IIS中的卷影復(fù)制(Shadow-copy)
我們?cè)贗IS的ASP.NETCore模塊中添加了一項(xiàng)新功能,以增加對(duì)影子復(fù)制應(yīng)用程序集的支持。當(dāng)前,.NET在Windows上運(yùn)行時(shí)會(huì)鎖定應(yīng)用程序二進(jìn)制文件,因此在應(yīng)用程序仍在運(yùn)行時(shí)無(wú)法替換二進(jìn)制文件。盡管我們建議仍然使用應(yīng)用程序脫機(jī)文件,但我們認(rèn)識(shí)到在某些情況下(例如FTP部署)不可能這樣做。
在這種情況下,可以通過(guò)自定義ASP.NET Core模塊處理程序設(shè)置來(lái)啟用卷影復(fù)制。在大多數(shù)情況下,ASP.NET Core應(yīng)用程序沒(méi)有將web.config簽入您可以修改的源代碼控制中(它們通常由SDK生成)。您可以添加此web.config示例以開(kāi)始使用。
<?xml?version="1.0"?encoding="utf-8"?> <configuration><!--?To?customize?the?asp.net?core?module?uncomment?and?edit?the?following?p.?For?more?info?see?https://go.microsoft.com/fwlink/?linkid=838655?--><system.webServer><handlers><remove?name="aspNetCore"/><add?name="aspNetCore"?path="*"?verb="*"?modules="AspNetCoreModulev2"?resourceType="Unspecified"/></handlers><aspNetCore?processPath="%LAUNCHER_PATH%"?arguments="%LAUNCHER_ARGS%"?stdoutLogEnabled="false"?stdoutLogFile=".\logs\stdout"><handlerSettings><handlerSetting?name="experimentalEnableShadowCopy"?value="true"?/><handlerSetting?name="shadowCopyDirectory"?value="../ShadowCopyDirectory/"?/><!--?Only?enable?handler?logging?if?you?encounter?issues--><!--<handlerSetting?name="debugFile"?value=".\logs\aspnetcore-debug.log"?/>--><!--<handlerSetting?name="debugLevel"?value="FILE,TRACE"?/>--></handlerSettings></aspNetCore></system.webServer> </configuration>您需要新版本的ASP.NET Core模塊才能?chē)L試使用此功能。在自托管的IIS服務(wù)器上,這需要新版本的托管捆綁包。在Azure App Services上,將需要安裝新的ASP.NET Core運(yùn)行時(shí)網(wǎng)站擴(kuò)展
ASP.NET Core運(yùn)行時(shí)網(wǎng)站擴(kuò)展SignalR C ++客戶端的Vcpkg移植
Vcpkg是用于C和C ++庫(kù)的跨平臺(tái)命令行軟件包管理器。我們最近在vcpkg中添加了一個(gè)SignalR C ++客戶端的移植,添加CMake native支持(也適用于MSBuild項(xiàng)目)。
您可以使用以下代碼段將SignalR客戶端添加到CMake項(xiàng)目中(假設(shè)您已經(jīng)包含了vcpkg工具鏈文件):
find_package(microsoft-signalr?CONFIG?REQUIRED) link_libraries(microsoft-signalr::microsoft-signalr)此后,無(wú)需任何其他配置即可準(zhǔn)備好在您的項(xiàng)目中使用 SignalR C ++客戶端并在其中使用它。有關(guān)使用SignalR C ++客戶端的C ++應(yīng)用程序的完整示例,請(qǐng)查看此存儲(chǔ)庫(kù)。
減少了空閑TLS連接的內(nèi)存占用
對(duì)于僅偶爾來(lái)回發(fā)送數(shù)據(jù)的長(zhǎng)期運(yùn)行的TLS連接,我們已大大減少了.NET 6中ASP.NET Core應(yīng)用程序的內(nèi)存占用。這將有助于提高WebSocket服務(wù)器等方案的可伸縮性。這主要是在System.IO.Pipelines、SslStream和 Kestrel 的許多改進(jìn)。讓我們看一下促成這種情況的一些改進(jìn):
減小System.IO.Pipelines.Pipe的大小
對(duì)于我們建立的每個(gè)連接,我們?cè)贙estrel中分配兩個(gè)管道:一個(gè)從傳輸層到請(qǐng)求的應(yīng)用程序,另一個(gè)從應(yīng)用程序?qū)拥巾憫?yīng)的傳輸。通過(guò)將System.IO.Pipelines.Pipe大小從368個(gè)字節(jié)縮小到264個(gè)字節(jié)(?28.2%),我們?yōu)槊總€(gè)連接節(jié)省了208個(gè)字節(jié)(每個(gè)管道104個(gè)字節(jié))。
池化 SocketSender
SocketSender對(duì)象(該子類(lèi)SocketAsyncEventArgs)在運(yùn)行時(shí)約為350個(gè)字節(jié)。我們可以合并它們SocketSender,而不是為每個(gè)連接分配新的對(duì)象,因?yàn)榘l(fā)送通常非常快,并且我們可以減少每個(gè)連接的開(kāi)銷(xiāo)。現(xiàn)在,我們只為每個(gè)連接支付350個(gè)字節(jié)IOQueue(每個(gè)隊(duì)列一個(gè),以避免爭(zhēng)用),而不是為每個(gè)連接支付350個(gè)字節(jié)。在具有5000個(gè)空閑連接的WebSocket服務(wù)器中,我們從分配?1.75 MB(350字節(jié)* 5000)到現(xiàn)在只為SocketSender對(duì)象分配?2.8kb(350字節(jié)* 8)。
零字節(jié)讀取 SslStream
無(wú)緩沖讀取是一種我們已經(jīng)在ASP.NET Core中采用的技術(shù),如果套接字上沒(méi)有可用數(shù)據(jù),則可以避免從內(nèi)存池中租用內(nèi)存。在進(jìn)行此更改之前,具有5,000個(gè)空閑連接的WebSocket服務(wù)器需要200兆字節(jié)(不帶TLS)的數(shù)據(jù),而使用TLS則需要800兆字節(jié)。其中一些分配(每個(gè)連接4k)來(lái)自Kestrel,必須在等待對(duì)SslStream的讀取完成時(shí)保留ArrayPool緩沖區(qū)。假設(shè)這些連接處于空閑狀態(tài),則讀取操作均不會(huì)完成,并將其緩沖區(qū)返回給ArrayPool,從而迫使ArrayPool分配更多的內(nèi)存。剩下的分配SslStream本身就是:用于TLS握手的4k緩沖區(qū)和用于正常讀取的32k緩沖區(qū)。在Preview3中,當(dāng)用戶在SslStream上執(zhí)行零字節(jié)讀取并且沒(méi)有可用數(shù)據(jù)時(shí),SslStream將在內(nèi)部對(duì)基礎(chǔ)包裝的流執(zhí)行零字節(jié)讀取。在最佳情況下(空閑連接),這些更改導(dǎo)致每個(gè)連接節(jié)省40 Kb,同時(shí)仍然允許在數(shù)據(jù)可用時(shí)通知使用者(Kestrel),而無(wú)需保留任何未使用的緩沖區(qū)。
零字節(jié)讀取 PipeReader
一旦SslStream支持了無(wú)緩沖讀取,我們便添加了對(duì)零字節(jié)讀取的選項(xiàng)StreamPipeReader,該內(nèi)部類(lèi)型將a適配Stream為a PipeReader。在Kestrel中,我們使用aStreamPipeReader將基礎(chǔ)適應(yīng)SslStream為a PipeReader,并且有必要在上公開(kāi)這些零字節(jié)讀取語(yǔ)義PipeReader。
現(xiàn)在,您可以創(chuàng)建一個(gè)PipeReader支持零字節(jié)讀取在任何底層Stream支持零字節(jié)讀取語(yǔ)義(例如,。SslStream,NetworkStream使用下面的API等):
var?reader?=?PipeReader.Create(stream,?new?StreamPipeReaderOptions(useZeroByteReads:?true));從 SlabMemoryPool 中移除 slabs
為了減少堆的碎片,Kestrel采用了一項(xiàng)技術(shù),在該技術(shù)中分配了128 KB的內(nèi)存作為其內(nèi)存池的一部分。然后將這些 slabs 進(jìn)一步劃分為4 KB的塊,供Kestrel在內(nèi)部使用。平板必須大于85 KB,以強(qiáng)制在大對(duì)象堆上進(jìn)行分配,以嘗試防止GC重新定位此數(shù)組。但是,隨著新一代GC(固定對(duì)象堆(POH))的引入,在 slabs 上分配塊不再有意義。在preview3中,我們現(xiàn)在直接在POH上分配塊,從而降低了管理我們自己的內(nèi)存池所涉及的復(fù)雜性。此更改將使將來(lái)的改進(jìn)變得更容易,例如使Kestrel所使用的內(nèi)存池更容易收縮。
WPF和WindowsForms的BlazorWebView 控件
對(duì)于.NET 6,我們添加了對(duì)使用.NET MAUI和Blazor構(gòu)建跨平臺(tái)混合桌面應(yīng)用程序的支持。混合應(yīng)用程序是利用Web技術(shù)實(shí)現(xiàn)其功能的本機(jī)應(yīng)用程序。例如,混合應(yīng)用程序可能使用嵌入式Web視圖控件來(lái)呈現(xiàn)Web UI。這意味著您可以使用HTML和CSS等網(wǎng)絡(luò)技術(shù)編寫(xiě)應(yīng)用程序UI,同時(shí)還可以利用本機(jī)設(shè)備功能。我們將在即將發(fā)布的.NET 6預(yù)覽版中引入對(duì)使用.NET MAUI和Blazor構(gòu)建混合應(yīng)用程序的支持。
在此版本中,我們引入了BlazorWebView用于WPF和Windows Forms應(yīng)用程序的控件,這些控件允許將Blazor功能嵌入到基于.NET 6的現(xiàn)有Windows桌面應(yīng)用程序中。使用Blazor和混合方法,您可以開(kāi)始將UI投資與WPF和Windows Forms脫鉤。這是一種現(xiàn)代化現(xiàn)有桌面應(yīng)用程序的好方法,可以將其引入.NET MAUI或在網(wǎng)絡(luò)上使用。您可以使用Blazor對(duì)現(xiàn)有的Windows Forms和WPF應(yīng)用程序進(jìn)行現(xiàn)代化改造,同時(shí)利用現(xiàn)有的.NET投資。
要使用新BlazorWebView控件,首先需要確保已安裝WebView2。
要將Blazor功能添加到現(xiàn)有的Windows Forms應(yīng)用程序中,請(qǐng)執(zhí)行以下操作:
將Windows Forms應(yīng)用更新為目標(biāo).NET 6。
將應(yīng)用程序項(xiàng)目文件中使用的SDK更新為Microsoft.NET.Sdk.Razor
添加對(duì)Microsoft.AspNetCore.Components.WebView.WindowsForms的包引用。
將以下wwwroot / index.html文件添加到項(xiàng)目中,用實(shí)際的項(xiàng)目名稱替換:{PROJECT NAME}
將以下具有一些基本樣式的app.css文件添加到wwwroot文件夾:
對(duì)于wwwroot文件夾中的所有文件,將“復(fù)制到輸出目錄”屬性設(shè)置為“如果較新則復(fù)制”。
將根Blazor組件Counter.razor添加到項(xiàng)目中:
將BlazorWebView控件添加到所需的表單以呈現(xiàn)根Blazor組件:
運(yùn)行該應(yīng)用程序以查看您BlazorWebView的操作:
要將Blazor功能添加到現(xiàn)有WPF應(yīng)用程序中,請(qǐng)按照Windows窗體應(yīng)用程序上面列出的相同步驟進(jìn)行操作,但以下步驟除外:
替換Microsoft.AspNetCore.Components.WebView.Wpf的程序包引用
BlazorWebView在XAML中添加控件:
將服務(wù)提供者設(shè)置為靜態(tài)資源:
要解決WPF運(yùn)行時(shí)內(nèi)部版本找不到Razor組件類(lèi)型的問(wèn)題,請(qǐng)?jiān)贑ounter.razor.cs中為該組件添加一個(gè)空的部分類(lèi):
構(gòu)建并運(yùn)行基于Blazor的WPF應(yīng)用程序:
給予反饋
我們希望您喜歡.NET 6中的ASP.NET Core預(yù)覽版。我們希望聽(tīng)到您使用此版本的體驗(yàn)。可以通過(guò)在GitHub上提交問(wèn)題,讓我們知道您的想法。
感謝您試用ASP.NET Core!
總結(jié)
以上是生活随笔為你收集整理的在 .NET 6 Preview 3 ASP.NET Core 更新的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 牛X,.NET6又双叒叕新版本,这是要起
- 下一篇: 如何在 ASP.Net Core 中使用