ASP.NET Core文件壓縮常見使用誤區(最佳實踐)
前言
在微軟官方文檔中,未明確指出文件壓縮功能的使用誤區。
本文將對 ASP.NET Core 文件響應壓縮的常見使用誤區做出說明。
誤區1:未使用Brotil 壓縮
幾乎不需要任何額外的代價,Brotil 壓縮算法可以幫助你的網站提升約 20% 靜態資源加載性能。
同時啟用 Gzip / Brotil 壓縮
Gzip 有更好的 user-agent 兼容性,而 Brotli 有更好的性能。
所以我們通常需要在 ASP.NET Core 網站中同時啟用這兩種壓縮。
如何區分 Gzip 壓縮和 Brotli 壓縮
網站啟用 Brotli 壓縮時,服務器請求返回頭 Content-Encoding 中會包含 br 字樣,否則是 gzip。
誤區2:使用 Fastest 級別的 Brotli 壓縮
如果你閱讀並參考瞭微軟官方文檔或者其他中文資源,比如:
ASP.NET Core 中的響應壓縮 – MS Doc
在ASP.NET Core中使用brotli壓縮- Cnblogs
那麼你可能會在代碼中像下面這樣使用壓縮功能:
寫法1:使用默認的壓縮行為(框架將隱式添加 Brotli 和 Gzip 功能)
public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddResponseCompression(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseResponseCompression(); } }
寫法2:顯式添加壓縮功能
public void ConfigureServices(IServiceCollection services) { services.AddResponseCompression(options => { options.Providers.Add<BrotliCompressionProvider>(); options.Providers.Add<GzipCompressionProvider>(); options.Providers.Add<CustomCompressionProvider>(); options.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat( new[] { "image/svg+xml" }); }); services.Configure<BrotliCompressionProviderOptions>(options => { options.Level = CompressionLevel.Fastest; }); }
寫法3:自定義 BrotliCompressionProvider
public class BrotliCompressionProvider : ICompressionProvider { public string EncodingName => "br"; public bool SupportsFlush => true public Stream CreateStream(Stream outputStream) { return new BrotliStream(outputStream,CompressionLevel.Fastest); } }
不幸的是,以上三種寫法都沒有發揮出 Brotil 壓縮算法的優勢。
它們的共同點是均使用瞭 CompressionLevel.Fastest壓縮級別。
而在 CompressionLevel.Fastest 級別時,Brotil 與 Gzip 壓縮性能幾乎無異。
參考:Introducing Support for Brotli Compression
圖 2-1 Fastest 模式下,三種算法的壓縮率等同
誤區3:使用 Optimal 級別的 Brotli 壓縮
CompressionLevel 隻有三個枚舉值:Fastest / NoCompression / Optimal。
既然 Fastest 級別沒有用,那我們隻能換成 Optimal 瞭。
圖 3-1 壓縮級別枚舉
非常不幸,Brotil 的 Optimal 壓縮級別存在嚴重的性能問題,在實際網站應用中幾乎沒有適用的場景。
圖 3-2 Optimal 壓縮耗時對比
最佳實踐:使用 4 或 5 級別的 Brotli 壓縮
在Introducing Support for Brotli Compression這篇文章中,作者對不同級別 Brotil 的壓縮耗時做瞭評測,也就是下面這幅圖。
圖 4-1 不同壓縮級別下 Brotli 的壓縮耗時
觀察這副圖,Brotil 的壓縮質量其實有 1~11 個級別。
那我們如何自定義 Brotli 的壓縮級別呢,答案是直接將級別對應的整數轉成 CompressionLevel 枚舉。
參考:Setting a specific Brotli compression level when using response compression in ASP.NET Core
圖 4-2 指定 Brotli 的壓縮級別
盡管這種寫法看起來十分古怪,但通過考察 .NET 源碼,可以確鑿這種寫法是可行的。
參考:System.IO.Compression.BrotliUtils.cs
圖 4-3 CompressionLevel 枚舉強制轉換整數
現在我們可以自定義壓縮級別瞭,但註意上方源碼,隻能指定 3 以上的級別,3 包括 3 以下的值有其他對應的轉換邏輯。
回到本節第一副圖 4-1,通過實測,發現在 4 / 5 級別下,Brotli 確實可以獲得最佳的壓縮率和較低的壓縮損耗。
總結
在 ASP.NET Core 中,我們應該同時啟用 Gzip 和 Brotil 壓縮功能,其中 Brotil 的壓縮級別應該自定義到 4 或 5。
public void ConfigureServices(IServiceCollection services) { services.AddResponseCompression(options => { options.Providers.Add<BrotliCompressionProvider>(); options.Providers.Add<GzipCompressionProvider>(); options.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat( new[] { "image/svg+xml" }); }); services.Configure<BrotliCompressionProviderOptions>(options => { options.Level = (CompressionLevel)4; // 4 or 5 is OK }); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseResponseCompression(); }
以上就是ASP.NET Core文件壓縮最佳實踐的詳細內容,更多關於ASP.NET Core文件壓縮的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- 如何在ASP.NET Core中使用Session的示例代碼
- ASP.NET Core中的配置詳解
- ASP.NET Core如何註入多個服務實現類
- ASP.NET Core MVC創建控制器與依賴註入講解
- 詳解如何在ASP.Net Core中實現健康檢查