|
|
前言$ }; o! A* R$ R6 F5 R
u3 K4 o4 I$ S- v 在微软官方文档中,未明确指出文件压缩功能的使用误区。
. b, ?. V: J: _: l; l 本文将对 ASP.NET Core 文件响应压缩的常见使用误区做出说明。. z$ `: D7 G/ j% v( Y& O
误区1:未使用Brotil 压缩
/ v3 {, O' V5 _$ P/ p/ B% @6 X
: N _1 t1 F* S8 i 几乎不需要任何额外的代价,Brotil 压缩算法可以帮助你的网站提升约 20% 静态资源加载性能。9 p; d8 E2 ~: h2 G
同时启用 Gzip / Brotil 压缩
, Q2 M7 T9 R; d; g4 r4 ~( ?3 i Gzip 有更好的 user-agent 兼容性,而 Brotli 有更好的性能。
4 \% X7 R1 u/ x; b7 o 所以我们通常需要在 ASP.NET Core 网站中同时启用这两种压缩。
+ z8 ~/ {& T; C0 I 如何区分 Gzip 压缩和 Brotli 压缩8 b0 c( M* U8 b+ ?
网站启用 Brotli 压缩时,服务器请求返回头 Content-Encoding 中会包含 br 字样,否则是 gzip。8 I/ p1 P- o5 C$ @2 }& z
误区2:使用 Fastest 级别的 Brotli 压缩8 Z. e6 t; T8 b z3 x/ @5 {6 _
3 e3 B4 T- H1 C' [
如果你阅读并参考了微软官方文档或者其他中文资源,比如:
5 ~1 u6 |0 U2 p ASP.NET Core 中的响应压缩 - MS Doc
L3 [% a; n& P+ X. G( b! V 在ASP.NET Core中使用brotli压缩- Cnblogs
0 w( x C3 i" g$ G" Z$ G4 | 那么你可能会在代码中像下面这样使用压缩功能:
8 `1 o9 z3 z; `3 P: i- B: v 写法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 压缩算法的优势。
- F* q% h% h8 \ 它们的共同点是均使用了 CompressionLevel.Fastest压缩级别。1 n, F. E1 C3 [3 { ~$ q) {* E# J/ W
而在 CompressionLevel.Fastest 级别时,Brotil 与 Gzip 压缩性能几乎无异。3 v) A8 Q6 B- W- A# b* G
参考:Introducing Support for Brotli Compression( q8 T* {' o- ?8 T/ r* D- p
3 x/ Z7 m' d4 u* l( `图 2-1 Fastest 模式下,三种算法的压缩率等同& t# |( o3 O7 O+ V
误区3:使用 Optimal 级别的 Brotli 压缩! {8 Y8 N% \* M3 ^
2 r/ F4 _0 p F4 |- I, l* R
CompressionLevel 只有三个枚举值:Fastest / NoCompression / Optimal。
7 H' x, T& }& W 既然 Fastest 级别没有用,那我们只能换成 Optimal 了。
5 x) k6 Q% B$ I) \' K7 P, Z) f2 x9 ]" M
图 3-1 压缩级别枚举
1 T0 }% a5 q/ k 非常不幸,Brotil 的 Optimal 压缩级别存在严重的性能问题,在实际网站应用中几乎没有适用的场景。
2 ]. B1 Q8 }% @: |, U
! V6 s' j3 K3 A- c( _$ S- I图 3-2 Optimal 压缩耗时对比; |+ }4 N8 J" v8 C
最佳实践:使用 4 或 5 级别的 Brotli 压缩( O3 x" S& [- D& {5 s% C
. P% f2 r, f; v# s3 |
在Introducing Support for Brotli Compression这篇文章中,作者对不同级别 Brotil 的压缩耗时做了评测,也就是下面这幅图。
2 N5 f" g$ k. i5 h6 d/ h4 d3 n* k9 ?, H6 W
图 4-1 不同压缩级别下 Brotli 的压缩耗时( i* Y F4 B" k5 @# E# ~
观察这副图,Brotil 的压缩质量其实有 1~11 个级别。
" m! v8 U6 r2 ]' F. s 那我们如何自定义 Brotli 的压缩级别呢,答案是直接将级别对应的整数转成 CompressionLevel 枚举。
9 m, E4 t! i* N3 f7 x5 S) R 参考:Setting a specific Brotli compression level when using response compression in ASP.NET Core9 X. ^6 F: T- C& N5 _
; \: C. K/ A b) \- U6 j9 M
图 4-2 指定 Brotli 的压缩级别+ m0 \7 Y8 f+ Z7 E
尽管这种写法看起来十分古怪,但通过考察 .NET 源码,可以确凿这种写法是可行的。
' l% ?5 ~* p0 e4 |0 b 参考:System.IO.Compression.BrotliUtils.cs& U+ j* x& O! N x. F
$ F8 I9 \! D! J9 m9 j图 4-3 CompressionLevel 枚举强制转换整数3 M/ ?4 U2 T; i L# Z, e
现在我们可以自定义压缩级别了,但注意上方源码,只能指定 3 以上的级别,3 包括 3 以下的值有其他对应的转换逻辑。
/ j. D, x9 F( I% I5 K 回到本节第一副图 4-1,通过实测,发现在 4 / 5 级别下,Brotli 确实可以获得最佳的压缩率和较低的压缩损耗。1 ~. Q0 b! h! M6 l0 X
总结
- K ]% n& r- B$ g
8 p% {9 D9 d. d! C" p D 在 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文件压缩的资料请关注脚本之家其它相关文章!
8 x8 x7 V% `! H3 b% }' |6 ^% g3 j! C" t
来源:http://www.jb51.net/article/213390.htm
$ S+ w* p) Q& a0 c/ w3 q% l; l* l+ `免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|