ASP.NET Core 9.0 中新增的MapStaticAssets() 中間件詳解
前言
在Core 9.0
版本中新增的內(nèi)容不算多,除了內(nèi)置OpenAPI 外 應(yīng)該就屬MapStaticAssets
中間件最有價值了,最初MapStaticAssets主要是為了解決Blazor
靜態(tài)資源加載緩慢而生的,當(dāng)然只要是wwwroot
下的任何靜態(tài)資產(chǎn)都是可以使用TA平替UseStaticFiles
的,因此在了解了TA的優(yōu)勢后 建議升級到9.0的小伙伴都使用TA平替UseStaticFiles!
既有缺陷
通常,在我們既有的NETCore項目中,我們都是使用UseStaticFiles
中間件來提供靜態(tài)資產(chǎn),不過TA存在以下的一些缺陷:
- 缺乏靜態(tài)資源的傳輸壓縮 (當(dāng)然,可以搭配壓縮中間件,或者容器壓縮(如IIS動態(tài)壓縮))
- 使用ETag進(jìn)行低效緩存(依賴于文件修改時間戳,因此內(nèi)容不變時間戳變更將會導(dǎo)致重新加載)
- 缺乏指紋識別(瀏覽器可能會緩存和重復(fù)使用舊版本的資產(chǎn),從而導(dǎo)致應(yīng)用更新后出現(xiàn)不一致,影響用戶體驗)
解決問題
MapStaticAssets
旨在解決上述UseStaticFiles存在的一些缺陷:
- 為應(yīng)用中的所有資產(chǎn)生成時間壓縮:
- 在開發(fā)期間
gzip
,在發(fā)布期間 gzip +brotli
- 所有資產(chǎn)都經(jīng)過壓縮,目標(biāo)是將資產(chǎn)大小降到最低。
- 基于內(nèi)容的 ETags:每個資源的 Etags 都是內(nèi)容的
SHA-256
哈希的 Base64 編碼字符串。 這可確保瀏覽器僅在文件內(nèi)容發(fā)生更改時重新下載文件。 - 指紋識別資源,通過資源唯一標(biāo)識,可以防止瀏覽器重復(fù)使用舊版本。當(dāng)應(yīng)用程序更新時,指紋會發(fā)生變化,從而確??蛻舳耸冀K收到最新的資產(chǎn)。
在MapStaticAssets
內(nèi)部的請求管道中TA做了下面這些事:
- 設(shè)置 ETag 和 Last-Modified 標(biāo)頭。
- 設(shè)置緩存標(biāo)頭。
- 使用 Caching Middleware。
- 如果可能,提供壓縮的靜態(tài)資產(chǎn)。
性能提升
下表顯示了默認(rèn)的 Razor Pages 模板中 CSS 和 JS 文件的原始大小和壓縮大小:
文件 | 原始 | 壓縮 | %縮減 |
---|---|---|---|
bootstrap.min.css | 163 | 17.5 | 89.26% |
jquery.js | 89.6 | 28 | 68.75% |
bootstrap.min.js | 78.5 | 20 | 74.52% |
總計 | 331.1 | 65.5 | 80.20% |
在使用Blazor
開發(fā)業(yè)務(wù)系統(tǒng)時將節(jié)省大量傳輸寬帶,極大的提升加載速度
不可替部分
當(dāng)然UseStaticFiles
仍然有TA不可替代的部分,比如虛擬文件提供者(如,嵌入的資產(chǎn),其他磁盤路徑資源,或網(wǎng)絡(luò)資源等)
比如資源是嵌入到程序集的情況下你仍然必須使用:
var embeddedFileProvider = new EmbeddedFileProvider(typeof(ISetting).Assembly, "Biwen.Settings"); app.UseStaticFiles(new StaticFileOptions { FileProvider = embeddedFileProvider, OnPrepareResponse = ctx => { ctx.Context.Response.Headers.Append("Cache-Control", "public,max-age=3600"); } });
結(jié)論
強(qiáng)烈建議在可替換UseStaticFiles()
的情況下使用MapStaticAssets()
到此這篇關(guān)于ASP.NET Core 9.0 中新增的MapStaticAssets() 中間件的文章就介紹到這了,更多相關(guān)ASP.NET Core 中間件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
asp.net下檢測遠(yuǎn)程URL是否存在的三種方法
檢測遠(yuǎn)程URL是否存在的三種方法,需要的朋友可以參考下。2009-12-12Asp.NET MVC中使用SignalR實現(xiàn)推送功能
這篇文章主要為大家詳細(xì)介紹了Asp.NET MVC 中使用 SignalR 實現(xiàn)推送功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-10-10Entity?Framework?Core相關(guān)包的概念介紹與安裝
這篇文章介紹了Entity?Framework?Core相關(guān)包的概念與安裝方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-03-03動態(tài)生成table并實現(xiàn)分頁效果心得分享
動態(tài)生成table并實現(xiàn)分頁在開發(fā)過程中時一個很好的應(yīng)用,接下來本文也要實現(xiàn)一個類似效果,感興趣的朋友可以參考下哈2013-04-04.NET9?EFcore支持早期MSSQL數(shù)據(jù)庫?ROW_NUMBER()分頁功能
文章介紹了如何在.NET?9中使用EF?Core實現(xiàn)對早期MSSQL數(shù)據(jù)庫的ROW_NUMBER()分頁兼容,由于EF?Core?9對底層API進(jìn)行了重大更新,原有的兼容代碼需要重新實現(xiàn),具體實現(xiàn)代碼跟隨小編一起看看吧2024-11-11