|
|
前言9 F# M; @. F. `' M& P" @
( L: { i3 M% l, i7 O. R
在微软官方文档中,未明确指出文件压缩功能的使用误区。
# [) j& _2 l& R: a2 ] 本文将对 ASP.NET Core 文件响应压缩的常见使用误区做出说明。8 o; b- U& d7 G: u' g% a
误区1:未使用Brotil 压缩 v) D7 c1 a0 j
! h5 e- ~, G+ |9 U
几乎不需要任何额外的代价,Brotil 压缩算法可以帮助你的网站提升约 20% 静态资源加载性能。: |6 ~' L2 W2 o. Q Z! K0 X
同时启用 Gzip / Brotil 压缩
; C2 |: z0 z/ v( D: `+ K+ N Gzip 有更好的 user-agent 兼容性,而 Brotli 有更好的性能。3 \5 _7 g5 D$ M% z+ C" O
所以我们通常需要在 ASP.NET Core 网站中同时启用这两种压缩。/ D2 i5 n3 ^% h% l+ q8 |6 C, S
如何区分 Gzip 压缩和 Brotli 压缩
( N. t3 Q7 X; F2 Y 网站启用 Brotli 压缩时,服务器请求返回头 Content-Encoding 中会包含 br 字样,否则是 gzip。$ x+ c$ |1 U9 J; F+ e$ p Y
误区2:使用 Fastest 级别的 Brotli 压缩8 H$ z Q/ @+ _8 S, o# K
6 A; y' F9 I! m) w! f 如果你阅读并参考了微软官方文档或者其他中文资源,比如:
& F, q' \- `1 k1 o" k$ Y ASP.NET Core 中的响应压缩 - MS Doc. W6 B. {5 S* M& Z
在ASP.NET Core中使用brotli压缩- Cnblogs! j2 J |+ l* Y2 ]( ?
那么你可能会在代码中像下面这样使用压缩功能:3 g- a# D0 s' E: f; r S$ ]8 f
写法1:使用默认的压缩行为(框架将隐式添加 Brotli 和 Gzip 功能)- public class Startup{ public void ConfigureServices(IServiceCollection services) { services.AddResponseCompression(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseResponseCompression(); }}
复制代码 写法2:显式添加压缩功能- 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- public class BrotliCompressionProvider : ICompressionProvider{ public string EncodingName => "br"; public bool SupportsFlush => true public Stream CreateStream(Stream outputStream) { return new BrotliStream(outputStream,CompressionLevel.Fastest); }}
复制代码 不幸的是,以上三种写法都没有发挥出 Brotil 压缩算法的优势。2 k: E2 `! @" ?& p" ~# @. D( ?' f/ q
它们的共同点是均使用了 CompressionLevel.Fastest压缩级别。
. s8 g, C0 ~6 R 而在 CompressionLevel.Fastest 级别时,Brotil 与 Gzip 压缩性能几乎无异。
' H& {4 h/ u" R1 N" @* \ o* J 参考:Introducing Support for Brotli Compression# b# Q K! `$ e- w }+ I+ C/ Q
8 W! k% f! e+ ~& r/ Y. [4 `
图 2-1 Fastest 模式下,三种算法的压缩率等同: y f: K' Z- m# l Y
误区3:使用 Optimal 级别的 Brotli 压缩
) J) Y: s* N2 s, Q+ B6 ?9 A8 G! y$ t4 v& i& Y q/ u
CompressionLevel 只有三个枚举值:Fastest / NoCompression / Optimal。 H6 P* a0 y/ ?) n9 I- y
既然 Fastest 级别没有用,那我们只能换成 Optimal 了。
7 d# x" ^- c3 U+ b% y) [5 p( M& ?/ A% _: _. m# d
图 3-1 压缩级别枚举1 z2 q) W3 f* P( u3 B* W2 C
非常不幸,Brotil 的 Optimal 压缩级别存在严重的性能问题,在实际网站应用中几乎没有适用的场景。
5 V; e2 v$ I" G& d* n7 D' @ W5 b1 w. t4 s
图 3-2 Optimal 压缩耗时对比7 G5 j7 q, x. x* A' O
最佳实践:使用 4 或 5 级别的 Brotli 压缩
. o1 s6 r7 X' Q, F, E
4 s* s5 v& N ^# j$ p 在Introducing Support for Brotli Compression这篇文章中,作者对不同级别 Brotil 的压缩耗时做了评测,也就是下面这幅图。7 p) q5 A( X; \# s$ b
4 h' I6 s" ~; {1 E9 n) W T: W图 4-1 不同压缩级别下 Brotli 的压缩耗时
! o, S1 n- B0 I. I5 s 观察这副图,Brotil 的压缩质量其实有 1~11 个级别。
9 ?' t, @: a( n/ s) o/ v, m6 i 那我们如何自定义 Brotli 的压缩级别呢,答案是直接将级别对应的整数转成 CompressionLevel 枚举。0 ~6 ?9 _, @% Z" R# S- |
参考:Setting a specific Brotli compression level when using response compression in ASP.NET Core" h3 x! O- E4 z* n3 M* c
2 _/ o7 H% R7 Y2 ^* A图 4-2 指定 Brotli 的压缩级别
& A% G0 {2 T. Q; h: F3 i 尽管这种写法看起来十分古怪,但通过考察 .NET 源码,可以确凿这种写法是可行的。
5 a! [' G% t$ h" i3 `8 L 参考:System.IO.Compression.BrotliUtils.cs& ~. \, |9 D7 L% [! B" C
# a7 M; E2 ]4 q/ s9 q j% C; W" S
图 4-3 CompressionLevel 枚举强制转换整数% F) @4 h2 s& }4 s. W2 y9 X
现在我们可以自定义压缩级别了,但注意上方源码,只能指定 3 以上的级别,3 包括 3 以下的值有其他对应的转换逻辑。
: b! s0 L) J, B H2 c2 Q1 ~$ p1 b 回到本节第一副图 4-1,通过实测,发现在 4 / 5 级别下,Brotli 确实可以获得最佳的压缩率和较低的压缩损耗。
& ?0 k# g+ P0 {2 g! O/ T0 W总结( W" ^. Y. q* |" K9 ~
3 F8 t2 o3 J* F
在 ASP.NET Core 中,我们应该同时启用 Gzip 和 Brotil 压缩功能,其中 Brotil 的压缩级别应该自定义到 4 或 5。- 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文件压缩的资料请关注脚本之家其它相关文章!
1 v, ]- D' B9 N4 T& T( H& g, g4 q+ d1 z8 T4 ~6 J; W# u+ f
来源:http://www.jb51.net/article/213390.htm
& \& _! T, X6 {* ?5 m* d免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|