在ASP.NET Core中使用brotli壓縮

Brotli是一種全新的數據格式,能夠提供比Zopfli高20-26%的壓縮比。據谷歌研究,Brotli壓縮速度同zlib的Deflate實現大體相同,而在Canterbury語料庫上的壓縮密度比LZMA和bzip2略大。 連接:Google開源Brotli壓縮算法 微軟使用了一種基於谷歌提供的C代碼的實現,向.NET Core 2.1添加了Brotli壓縮支持。因爲Brotli獲得了許多Web瀏覽器和Web服務器的普遍支持,因此.NET Core提供對這項技術的支持是很是有用的。html

什麼是 Brotli 壓縮算法

Brotli最初發佈於2015年,用於網絡字體的離線壓縮。Google軟件工程師在2015年9月發佈了包含通用無損數據壓縮的Brotli加強版本,特別側重於HTTP壓縮。其中的編碼器被部分改寫以提升壓縮比,編碼器和解碼器都提升了速度,流式API已被改進,增長更多壓縮質量級別。新版本還展示了跨平臺的性能改進,以及減小解碼所需的內存。web

與常見的通用壓縮算法不一樣,Brotli使用一個預約義的120千字節字典。該字典包含超過13000個經常使用單詞、短語和其餘子字符串,這些來自一個文本和HTML文檔的大型語料庫。預約義的算法能夠提高較小文件的壓縮密度。算法

使用brotli替換deflate來對文本文件壓縮一般能夠增長20%的壓縮密度,而壓縮與解壓縮速度則大體不變。使用Brotli進行流壓縮的內容編碼類型已被提議使用「br」。瀏覽器

摘自:https://zh.wikipedia.org/wiki/Brotli緩存

另附 Brotli 算法和其餘算法的性能比較:服務器

大部分瀏覽器都已經支持Brotli壓縮網絡

Brotli瀏覽器支持

因此,除了gzip以外,該是支持Brotli的時候了!有關 ASP.NET 核心響應壓縮中間件:https://docs.microsoft.com/zh-cn/aspnet/core/performance/response-compression?view=aspnetcore-2.1&tabs=aspnetcore2x, 這篇文章中已經介紹了在asp.net core中使用 GzipCompressionProvider,同時也介紹了自定義提供程序來支持Brotli 壓縮,微軟.net團隊博客有篇文章詳細的介紹了Brotli https://blogs.msdn.microsoft.com/dotnet/2017/07/27/introducing-support-for-brotli-compression/app

在 netcoreapp2.1 包裏面包含了 System.IO.Compression.Brotliasp.net

image

響應壓縮中間件查看請求的頭部並檢查壓縮提供者是否能夠處理其中一種可接受的編碼。默認狀況下,只支持gzip算法。經過實施自定義壓縮提供程序來支持自定義編碼。自定義提供程序必須實現該ICompressionProvider接口。該接口包含一個具備編碼名稱的屬性以及一個建立壓縮流的方法。System.IO.Compression.Brotli.dll 提供了一個BrotliStream類,因此實現很是簡單:ide

public class BrotliCompressionProvider : ICompressionProvider
     {
         public string EncodingName => "br";
         public bool SupportsFlush => true;

        public Stream CreateStream(Stream outputStream)
         {
                return new BrotliStream(outputStream,CompressionLevel.Fastest);
         }
     }

客戶端提交的請求Accept-Encoding: br 標頭。 該中間件使用自定義壓縮的實現,並返回響應,其中Content-Encoding: br 標頭。 客戶端必須可以解壓縮順序用於工做的自定義壓縮實現的自定義編碼brotli 。

image

VaryContent-Encoding標頭會顯示在響應。當壓縮響應基於Accept-Encoding標頭,有可能的多個壓縮的版本響應和未壓縮的版本。 若要指示客戶端和代理服務器緩存,多個版本存在,而且應存儲Vary標頭添加與Accept-Encoding值。 

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
     services.AddResponseCompression(options =>
     {         
         options.Providers.Add<BrotliCompressionProvider>();
         options.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(new[] { "image/svg+xml" });
     });

}

public void Configure(IApplicationBuilder app)
{
    app.UseResponseCompression();
    app.UseStaticFiles();
    app.UseMvcWithDefaultRoute();
}
相關文章
相關標籤/搜索