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