京东6.18大促主会场领京享红包更优惠

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4540|回复: 0

ASP.NET Core文件压缩常见使用误区(最佳实践)

[复制链接]

18

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2021-8-8 05:16:25 | 显示全部楼层 |阅读模式 来自 中国
前言
  j8 U  E# _9 I1 Q2 h5 i1 x8 [1 x$ h# t3 T% a
  在微软官方文档中,未明确指出文件压缩功能的使用误区。
7 g+ \: p$ n- z/ G, T* l" I  本文将对 ASP.NET Core 文件响应压缩的常见使用误区做出说明。
1 k# c2 u& s& V* P; s2 _4 F误区1:未使用Brotil 压缩
; h7 b" M' Z( i. B0 Y5 J1 o! H' @
  几乎不需要任何额外的代价,Brotil 压缩算法可以帮助你的网站提升约 20% 静态资源加载性能。( h7 e+ Y; X% v8 l" D. l8 W
  同时启用 Gzip / Brotil 压缩* f8 F/ a/ }) g3 y# o: J
  Gzip 有更好的 user-agent 兼容性,而 Brotli 有更好的性能。
) c( s$ H  \- J7 A  所以我们通常需要在 ASP.NET Core 网站中同时启用这两种压缩。' A% ?+ g' ?# \7 K, V/ |0 }
  如何区分 Gzip 压缩和 Brotli 压缩# J  j& _/ Q* e: w4 D
  网站启用 Brotli 压缩时,服务器请求返回头 Content-Encoding 中会包含 br 字样,否则是 gzip。, l# j5 Z. ?7 \* t' D; R
误区2:使用 Fastest 级别的 Brotli 压缩1 `" }+ N" t, ?8 q8 u" f: g% s

5 H8 G- f6 a$ Y% i& u# q  如果你阅读并参考了微软官方文档或者其他中文资源,比如:
; {( [& A/ z/ |; L  ASP.NET Core 中的响应压缩 - MS Doc
0 V& N7 N1 A( W8 P! W  在ASP.NET Core中使用brotli压缩- Cnblogs  J) C! z* T# M5 l6 a- F6 M# l3 A; ]
  那么你可能会在代码中像下面这样使用压缩功能:
" V. L' Z( @9 w9 k0 |. l/ I9 x9 z  写法1:使用默认的压缩行为(框架将隐式添加 Brotli 和 Gzip 功能)
  1. public class Startup{    public void ConfigureServices(IServiceCollection services)    {        services.AddResponseCompression();    }    public void Configure(IApplicationBuilder app, IHostingEnvironment env)    {        app.UseResponseCompression();    }}
复制代码
  写法2:显式添加压缩功能
  1. public void ConfigureServices(IServiceCollection services){    services.AddResponseCompression(options =>    {        options.Providers.Add();        options.Providers.Add();        options.Providers.Add();        options.MimeTypes =             ResponseCompressionDefaults.MimeTypes.Concat(                new[] { "image/svg+xml" });    });    services.Configure(options =>     {        options.Level = CompressionLevel.Fastest;    });}
复制代码
  写法3:自定义 BrotliCompressionProvider
  1. public class BrotliCompressionProvider : ICompressionProvider{    public string EncodingName => "br";    public bool SupportsFlush => true    public Stream CreateStream(Stream outputStream)    {           return new BrotliStream(outputStream,CompressionLevel.Fastest);    }}
复制代码
  不幸的是,以上三种写法都没有发挥出 Brotil 压缩算法的优势。9 A1 V$ s& C9 t/ H
  它们的共同点是均使用了 CompressionLevel.Fastest压缩级别。7 p. j2 K6 C9 U6 c% {8 a
  而在 CompressionLevel.Fastest 级别时,Brotil 与 Gzip 压缩性能几乎无异。
8 a3 P8 z4 ~# n- J9 G  参考:Introducing Support for Brotli Compression4 m( ~8 @! @' s' j2 d5 b7 z( u

  d% Q( i% t% M- z图 2-1 Fastest 模式下,三种算法的压缩率等同% l9 p* n' ?8 ^, w8 w( B
误区3:使用 Optimal 级别的 Brotli 压缩3 G( x: D: x5 }; u) z4 W. o2 }6 G+ J

; G5 m7 Y( ?9 N0 _3 l5 v  CompressionLevel 只有三个枚举值:Fastest / NoCompression / Optimal。+ O) X! v) u# }% V
  既然 Fastest 级别没有用,那我们只能换成 Optimal 了。
% C$ i$ e! P7 z, L, b$ Y

  @5 d8 T& t' x5 X$ l1 w& k图 3-1 压缩级别枚举5 G) d0 q4 t. f/ T% @( Z$ L. x1 E: b
  非常不幸,Brotil 的 Optimal 压缩级别存在严重的性能问题,在实际网站应用中几乎没有适用的场景。
/ t0 M; r' `4 {
+ G0 w, f  B' W% l0 \
图 3-2 Optimal 压缩耗时对比( g+ V; }* J, v% }; @) e" c
最佳实践:使用 4 或 5 级别的 Brotli 压缩
% a# t. n3 q$ z' R0 V, J# e4 w1 ^, b
# ^9 q) B; [* w  在Introducing Support for Brotli Compression这篇文章中,作者对不同级别 Brotil 的压缩耗时做了评测,也就是下面这幅图。( W+ j/ T$ r4 K% I4 O% r, _
% M5 ?+ M- \( V" a" M1 n, {- {
图 4-1 不同压缩级别下 Brotli 的压缩耗时7 J; o/ {% H# m* R% M0 I! b
  观察这副图,Brotil 的压缩质量其实有 1~11 个级别。' P4 J% @  s  f& I* F  n
  那我们如何自定义 Brotli 的压缩级别呢,答案是直接将级别对应的整数转成 CompressionLevel 枚举。
8 q& R. M+ o5 I" N9 g' s. U8 o  参考:Setting a specific Brotli compression level when using response compression in ASP.NET Core
! |$ T/ Z- h! z
$ \1 \5 h& `6 l& i/ d% L9 z
图 4-2 指定 Brotli 的压缩级别
; }& c) v* |' [* J' k! B  尽管这种写法看起来十分古怪,但通过考察 .NET 源码,可以确凿这种写法是可行的。
7 k9 U! V) r9 r6 t- B- _! i  参考:System.IO.Compression.BrotliUtils.cs. [6 W$ {/ D, f# Y
% ]6 c# E4 z: X
图 4-3 CompressionLevel 枚举强制转换整数
$ n- K2 s! \# Z  现在我们可以自定义压缩级别了,但注意上方源码,只能指定 3 以上的级别,3 包括 3 以下的值有其他对应的转换逻辑。; ?& Y. U: \9 }, Y  {+ W
  回到本节第一副图 4-1,通过实测,发现在 4 / 5 级别下,Brotli 确实可以获得最佳的压缩率和较低的压缩损耗。
$ H! @+ Z# ^# I" s1 n! s8 v) `/ {" H总结
( Z6 o& t+ h8 Z; a. B) E1 s7 m6 H8 P& b" U0 v$ ]
  在 ASP.NET Core 中,我们应该同时启用 Gzip 和 Brotil 压缩功能,其中 Brotil 的压缩级别应该自定义到 4 或 5。
  1. public void ConfigureServices(IServiceCollection services)        {            services.AddResponseCompression(options =>            {                options.Providers.Add();                options.Providers.Add();                options.MimeTypes =                    ResponseCompressionDefaults.MimeTypes.Concat(                        new[] { "image/svg+xml" });            });            services.Configure(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文件压缩的资料请关注脚本之家其它相关文章!+ w6 H* q+ c! Y& t5 F

3 V3 {6 c, T6 G来源:http://www.jb51.net/article/213390.htm* N2 B& J. n6 O, j: L% G: K* j
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

帖子地址: 

梦想之都-俊月星空 优酷自频道欢迎您 http://i.youku.com/zhaojun917
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|梦想之都-俊月星空 ( 粤ICP备18056059号 )|网站地图

GMT+8, 2026-9-17 00:42 , Processed in 0.038877 second(s), 25 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表