|
|
前言
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 功能)- 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 压缩算法的优势。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。- 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
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|