在ASP.NET Core中使用brotli壓縮

来源:https://www.cnblogs.com/shanyou/archive/2018/06/09/9154816.html
-Advertisement-
Play Games

Brotli是一種全新的數據格式,可以提供比Zopfli高20-26%的壓縮比。據谷歌研究,Brotli壓縮速度同zlib的Deflate實現大致相同,而在Canterbury語料庫上的壓縮密度比LZMA和bzip2略大。 鏈接:Google開源Brotli壓縮演算法 微軟使用了一種基於谷歌提供的C代 ...


Brotli是一種全新的數據格式,可以提供比Zopfli高20-26%的壓縮比。據谷歌研究,Brotli壓縮速度同zlib的Deflate實現大致相同,而在Canterbury語料庫上的壓縮密度比LZMA和bzip2略大。 鏈接:Google開源Brotli壓縮演算法 微軟使用了一種基於谷歌提供的C代碼的實現,向.NET Core 2.1添加了Brotli壓縮支持。由於Brotli得到了許多Web瀏覽器和Web伺服器的廣泛支持,所以.NET Core提供對這項技術的支持是非常有用的。

什麼是 Brotli 壓縮演算法

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

與常見的通用壓縮演算法不同,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/

在 netcoreapp2.1 包裡面包含了 System.IO.Compression.Brotli

image

響應壓縮中間件查看請求的頭部並檢查壓縮提供者是否可以處理其中一種可接受的編碼。預設情況下,只支持gzip演算法。通過實施自定義壓縮提供程式來支持自定義編碼。自定義提供程式必須實現該ICompressionProvider介面。該介面包含一個具有編碼名稱的屬性以及一個創建壓縮流的方法。System.IO.Compression.Brotli.dll 提供了一個BrotliStream類,所以實現非常簡單:

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();
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、概念 早期的 Java API 只支持由本地系統套接字型檔提供所謂的阻塞函數來支持網路編程。由於是阻塞 I/O ,要管理多個併發客戶端,需要為每個新的客戶端Socket 創建一個 Thread 。這將導致一系列的問題,第一,在任何時候都可能有大量的線程處於休眠狀態(不可能每時每刻都有對應的併發數) ...
  • 必需學會SpringBoot基礎知識 Takes an opinionated view of building production-ready Spring applications. Spring Boot favors convention over configuration and is ...
  • 本篇教大家如何用Python來實現QQ機器人,如有不足歡迎在評論方指出! 簡單介紹 安裝方法 可在 Python個版本下使用,用 pip 安裝: 使用方法 一、啟動 QQBot 二、操作 QQBot QQBot 啟動後,在另一個控制台視窗使用 qq 命令來操作 QQBot ,目前提供以下命令: li ...
  • 現有要求如下: 通過cmd的方式,求簡單表達式的值。 比如輸入 java Expression 3 + 4 得到的結果為:7 代碼: import java.text.DecimalFormat; public class Expression { public static void main(S ...
  • 本節主要內容:1. 初識⽂件操作2. 只讀(r, rb)3. 只寫(w, wb)4. 追加(a, ab)5. r+讀寫6. w+寫讀7. a+寫讀(追加寫讀)8. 其他操作⽅法9. ⽂件的修改以及另⼀種打開⽂件句柄的⽅式 主要內容:⼀. 初識⽂件操作使⽤python來讀寫⽂件是⾮常簡單的操作. 我們 ...
  • 一、常用字元串操作 upper(x)把字母變成大寫 lower(x)把字母變成小寫 split(str,num) 對字元串進行切割,返回一個列表:str-分隔符,預設為所有的空字元,包括空格,換行(\n),製表符(\t)等;num -- 分割次數 strip(chars ) 移除字元串頭尾指定的字元 ...
  • 有話要說: 這次準備講述後臺伺服器的搭建以及前臺訪問到數據的過程。 成果: 準備: 搭建伺服器: 用eclipse直接創建一個web工程,並將運行環境設置為Tomcat7 接著定義了四個類來實現了一個簡單的介面(通過servlet的方式),下麵來看看這四個類 NewsBean.java 該類是段子類 ...
  • 4、為何需要進行url去重? 運行爬蟲時,我們不需要一個網站被下載多次,這會導致cpu浪費和增加引擎負擔,所以我們需要在爬取的時候對url去重,另一方面:當我們大規模爬取數據時,當故障發生時,不需要進行url鏈接重跑(重跑會浪費資源、造成時間浪費) 5、如何確定去重強度? 這裡使用去重周期確定強度: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...