ASP.NET Core如何使用压缩中间件提高Web应用程序性能
前言
压缩可以大大的降低我们Web服务器的响应速度,压缩从而提高我们网页的加载速度,以及节省一定的带宽.
何时使用相应压缩中间件
在IIS,Apache,Nginx中使用基于服务端的响应压缩技术。中间件的执行可能和服务端模块不匹配。HTTP.sys 和Kestrel server目前没有提供内置的压缩支持。
什么时候使用Response Compression Middleware:
- 无法使用以下基于服务器的压缩技术时:
-
IIS 动态压缩模块
-
apache的GZIP压缩
-
Nginx 压缩
- 直接托管:
- Http.sys 服务器
- Kestrel 服务器
如何添加MIME
中间件为压缩指定了一组默认的 MIME 类型:
- application/javascript
- application/json
- application/xml
- text/css
- text/html
- text/json
- text/plain
- text/xml
public void ConfigureServices(IServiceCollection services)
{
services.AddResponseCompression();
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseResponseCompression();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
默认是采用Brotli压缩
Brotli is a generic-purpose lossless compression algorithm that compresses data using a combination of a modern variant of the LZ77 algorithm, Huffman coding and 2nd order context modeling, with a compression ratio comparable to the best currently available general-purpose compression methods. It is similar in speed with deflate but offers more dense compression.
Brotli 是基于LZ77算法的一个现代变体、霍夫曼编码和二阶上下文建模。Google软件工程师在2015年9月发布了包含通用无损数据压缩的Brotli增强版本,特别侧重于HTTP压缩。其中的编码器被部分改写以提高压缩比,编码器和解码器都提高了速度,流式API已被改进,增加更多压缩质量级别。
与常见的通用压缩算法不同,Brotli使用一个预定义的120千字节字典。该字典包含超过13000个常用单词、短语和其他子字符串,这些来自一个文本和HTML文档的大型语料库。预定义的算法可以提升较小文件的压缩密度。
摘自:https://segmentfault.com/a/1190000009383543
- MimeTypes:设定要进行压缩的MimeTypes
- GzipCompressionProviderOptions:设置压缩方式(默认是CompressionLevel.Fastest快速压缩)
压缩前:
压缩后:
使用压缩的好处就是节省网络流量,压缩资源文件。但是消耗一点CPU性能.
gzip
- 默认情况下, Brotli 压缩提供程序会随Gzip 压缩提供程序一起添加到压缩提供程序的数组中。
- 他默认采用的是Brotli压缩,如果客户端不支持Brotli,客户端支持Gzip,则默认为Gzip.
public void ConfigureServices(IServiceCollection services)
{
services.AddResponseCompression(options=> {
options.Providers.Add<BrotliCompressionProvider>();
options.Providers.Add<GzipCompressionProvider>();
});
services.AddRazorPages();
}
有些MIME类型是需要我们自己为他将其加入压缩类型中的,我们可以从图中看到目前有一些未被压缩,那么我们可以将他手动增加一下类型.
public void ConfigureServices(IServiceCollection services)
{
services.AddResponseCompression(options=> {
options.Providers.Add<BrotliCompressionProvider>();
options.Providers.Add<GzipCompressionProvider>();
options.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(
new[] { "image/x-icon" });
});
services.AddRazorPages();
}
如何配置压缩级别
压缩级别 | 描述 |
---|---|
CompressionLevel.Fastest | 压缩应该尽快完成, 即使生成的输出未以最佳方式压缩。 |
CompressionLevel.NoCompression | 不应执行压缩。 |
CompressionLevel.Optimal | 即使压缩需要更长的时间, 也应以最佳方式压缩响应。 |
public void ConfigureServices(IServiceCollection services)
{
services.AddResponseCompression();
services.Configure<GzipCompressionProviderOptions>(options =>
{
options.Level = CompressionLevel.Fastest;
});
})
}
安全协议压缩
可以使用EnableForHttps选项控制安全连接上的压缩响应,该选项默认情况下处于禁用状态。对动态生成的页面使用压缩可能会导致安全问题,例如CRIME和BREACH攻击。
- EnableForHttps:是否对HTTPS封包进行压缩(默认是false)
public void ConfigureServices(IServiceCollection services)
{
services.AddResponseCompression(options=> {
options.Providers.Add<BrotliCompressionProvider>();
options.Providers.Add<GzipCompressionProvider>();
options.EnableForHttps = true;
options.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(
new[] { "image/x-icon" });
});
services.AddRazorPages();
}
dotnet济南俱乐部组建中有兴趣的小伙伴可以加入QQ群:743523033
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)