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压缩

所以,除了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

响应压缩中间件查看请求的头部并检查压缩提供者是否可以处理其中一种可接受的编码。默认情况下,只支持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 。

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

在ASP.NET Core中使用brotli压缩的更多相关文章

  1. ASP.NET Core中的响应压缩

    介绍     响应压缩技术是目前Web开发领域中比较常用的技术,在带宽资源受限的情况下,使用压缩技术是提升带宽负载的首选方案.我们熟悉的Web服务器,比如IIS.Tomcat.Nginx.Apache ...

  2. [小技巧]ASP.NET Core中如何预压缩静态文件

    原文地址:Pre-compressed static files with ASP.NET Core 作者:Gunnar Peipman 译者:Lamond Lu 译文:https://www.cnb ...

  3. C#调用接口注意要点 socket,模拟服务器、客户端通信 在ASP.NET Core中构建路由的5种方法

    C#调用接口注意要点   在用C#调用接口的时候,遇到需要通过调用登录接口才能调用其他的接口,因为在其他的接口需要在登录的状态下保存Cookie值才能有权限调用, 所以首先需要通过调用登录接口来保存c ...

  4. ASP.NET Core 资源打包与压缩

    ASP.NET Core 资源打包与压缩 在ASP.NET 中可以使用打包与压缩来提高Web应用程序页面加载的性能. 打包是将多个文件(CSS,JS等资源文件)合并或打包到单个文件.文件合并可减少We ...

  5. ASP.NET Core 中的SEO优化(1):中间件实现服务端静态化缓存

    分享 最近在公司成功落地了一个用ASP.NET Core 开发前台的CMS项目,虽然对于表层的开发是兼容MVC5的,但是作为爱好者当然要用尽量多的ASP.NET Core新功能了. 背景 在项目开发的 ...

  6. Asp.Net Core 中的环境变量

    Asp.Net Core 中的环境变量 软件开发环境在大多数软件开发组织中,我们通常具有以下开发环境. 开发环境--Development 演示(模拟.临时)环境--Staging 生产环境-- Pr ...

  7. gRPC在 ASP.NET Core 中应用学习(二)

    前言: 上一篇文章中简单的对gRPC进行了简单了解,并实现了gRPC在ASP.NET Core中服务实现.客户端调用:那么本篇继续对gRPC的4中服务方法定义.其他使用注意点进一步了解学习 一.gRP ...

  8. ASP.NET Core 中的那些认证中间件及一些重要知识点

    前言 在读这篇文章之间,建议先看一下我的 ASP.NET Core 之 Identity 入门系列(一,二,三)奠定一下基础. 有关于 Authentication 的知识太广,所以本篇介绍几个在 A ...

  9. Asp.net Core中使用Session

    前言 2017年就这么悄无声息的开始了,2017年对我来说又是特别重要的一年. 元旦放假在家写了个Asp.net Core验证码登录, 做demo的过程中遇到两个小问题,第一是在Asp.net Cor ...

随机推荐

  1. 【转】iPython入门技巧

    [转]http://www.cnblogs.com/cuiyubo/p/6823478.html 学习<利用python进行数据分析> 第三章 IPython:一种交互式计算和开发环境的笔 ...

  2. habse Region server挂掉

    2019-04-28 15:57:28,355 INFO org.apache.hadoop.hbase.regionserver.HeapMemoryManager: heapOccupancyPe ...

  3. HTML5画布小dome八卦图

      <!DOCTYPE html>   <html>   <head>   <meta charset="utf-8" />   & ...

  4. 使用requests+pyquery爬取dd373地下城跨五最新商品信息

    废话不多说直接上代码: 可以使用openpyel库对爬取的信息写入Execl表格中代码我就不上传了 import requests from urllib.parse import urlencode ...

  5. 解决idea server 控制台乱码问题

    如果网上其他方式不奏效,可尝试下面方法: 找到tomcat 的配置文件:"D:\Program Files\apache-tomcat-9.0.17\conf\logging.propert ...

  6. php 通过curl header传值

    下面是自己整理的通过curl  header传值 方式是post $url = 'http://www.***.com';//此处为传值需要访问的地址 $header = array('token:J ...

  7. Redis数据类型Set

    Redis的SET是无序的String集合,它里面的元素是不会重复的. SADD,SMEMBERS SADD命令会添加新元素到SET,可以看到一次性可以添加一个或多个元素.SMEMBERS可以获取se ...

  8. 自己动手造拖拉机轮子系列 -(react-loadable)

    最新消息:react官方已支持懒加载https://reactjs.org/docs/code-splitting.html#reactlazy 文章webpack分片chunk加载原理中深入探究了异 ...

  9. 对JS 的classList 简单记录

    一 对classList整体感觉 浏览器支持参考(http://www.runoob.com/jsref/prop-element-classlist.html) classList 是一个对象 ,返 ...

  10. python常见的函数和类方法

    在学python编程时 常常会遇到些常见的函数 记录学习 1. getattr函数 """ getattr() 函数用于返回一个对象属性值. 语法: getattr(ob ...