ASP.NET Core 並不會自動把所有封包壓縮,要針對 Response 的內容做壓縮,可以使用的 ResponseCompression 套件提供的壓縮方式。
本篇將介紹 ASP.NET Core 以 Gzip 方式對 Response 封包壓縮。
iT 邦幫忙 2018 鐵人賽 - Modern Web 組參賽文章:
[Day29] ASP.NET Core 2 系列 - 封包壓縮 (Gzip)
啟用封包壓縮
Response 的內容壓縮,需要
Microsoft.AspNetCore.ResponseCompression套件。
ASP.NET Core 2.0 以上版本,預設是參考Microsoft.AspNetCore.All,已經包含Microsoft.AspNetCore.ResponseCompression,所以不用再安裝。
如果是 ASP.NET Core 1.0 的版本,可以透過 .NET Core CLI 在專案資料夾執行安裝指令:
1 | dotnet add package Microsoft.AspNetCore.ResponseCompression |
在 Startup.ConfigureServices 加入封包壓縮的服務以及 Startup.Configure 註冊封包壓縮的 Middleware,如下:
Startup.cs
1 | using Microsoft.AspNetCore.Builder; |
預設的壓縮方式就是使用 Gzip。
壓縮前:
![[鐵人賽 Day29] ASP.NET Core 2 系列 - 封包壓縮 (Gzip) - 壓縮前](/images/ironman/i29-1.png)
壓縮後:
![[鐵人賽 Day29] ASP.NET Core 2 系列 - 封包壓縮 (Gzip) - 壓縮後](/images/ironman/i29-2.png)
ResponseCompressionOptions
從上圖可以看出,不是所有的封包都被壓縮,像圖片就沒被壓縮。
可以透過 ResponseCompressionOptions 調整要被壓縮的 MimeTypes 以及壓縮的方法等。
Startup.cs
1 | // ... |
EnableForHttps
是否要對 HTTPS 的封包進行壓縮。
(預設是 false)MimeTypes設定要進行壓縮的MimeTypes。
(預設的MimeTypes有:text/plain、text/css、application/javascript、text/html、application/xml、text/xml、application/json、text/json)GzipCompressionProviderOptions
設定 Gzip 的壓縮方式。
(預設是CompressionLevel.Fastest快速壓縮)
調整完 MimeTypes 及 CompressionLevel 後,原本沒有 Gzip 壓縮的 PNG 圖檔都被壓縮了,並且其他的封包也比先前壓縮得更小了,如圖:
![[鐵人賽 Day29] ASP.NET Core 2 系列 - 封包壓縮 (Gzip) - 執行結果](/images/ironman/i29-3.png)
壓縮的好處是 Response 的封包變小,節省一些網路流量,但缺點是會消耗一點 CUP 效能。
自訂壓縮
某些情況可能會需要自訂封包的壓縮的方式,例如 Server to Server 的 API 對接,雙方指定好特定的壓縮方法。
可以繼承 ICompressionProvider 實作客製化的壓縮方法,並透過 HTTP Header 的 Accept-Encoding 指定壓縮方法,如下:
CustomCompressionProvider.cs
1 | public class CustomCompressionProvider : ICompressionProvider |
把自製的 CustomCompressionProvider 加入至 ResponseCompressionOptions.Providers,如下:
Startup.cs
1 | // ... |
當 HTTP Header 的 Accept-Encoding=customcompression 就會使用 CustomCompressionProvider 壓縮封包,執行結果:
![[鐵人賽 Day29] ASP.NET Core 2 系列 - 封包壓縮 (Gzip) - 自訂壓縮執行結果](/images/ironman/i29-4.png)