在今天的文章中,我将讨论 .NET Core 中的“响应压缩”功能。
首先,我想简单谈谈什么是“响应压缩”。_ 响应压缩 _ 是 .NET Framework 或 .NET Core 中使用的一种技术。此技术通过压缩 Web 应用程序在服务器端发送的数据来减小数据的大小。这样可以减少网络流量,加快数据传输速度并改善用户体验。
此压缩是使用 HTTP 协议执行的。服务器可以使用 Gzip、Deflate 或 Brotli 等算法来压缩数据。浏览器支持这些算法,可以检索压缩数据并将其转换回原始数据。
如何使用?
这个功能的使用其实很简单:
您需要将以下代码添加到 Startup.cs:
builder.Services.AddResponseCompression(options =>
{
options.EnableForHttps = true;
});app.UseResponseCompression();
压缩提供程序
压缩提供程序通过应用特定的压缩算法来压缩或解压缩数据。例如,GzipCompressionProvider 使用 Gzip 压缩算法压缩和解压缩数据。BrotliCompressionProvider 使用 Brotli 压缩算法。
**BrotliCompressionProvider:**实现 Brotli 压缩算法的提供程序。Brotli 是一种较新的压缩算法,通常提供比 Gzip 或 Deflate 更好的压缩比。BrotliCompressionProvider 使服务器能够使用 Brotli 算法压缩数据,并在浏览器支持 Brotli 压缩的地方对其进行解压缩。
**GzipCompressionProvider:**实现 Gzip 压缩算法的提供程序。Gzip 是 Web 应用程序中常用的压缩算法。GzipCompressionProvider 允许服务器使用 Gzip 算法压缩数据,并在浏览器支持 Gzip 压缩时解压缩数据。
builder.Services.AddResponseCompression(options =>
{
options.EnableForHttps = true;
options.Providers.Add();
options.Providers.Add();
});
在此代码块中使用两个不同的压缩提供程序(BrotliCompressionProvider 和 GzipCompressionProvider)是为了支持不同的客户端压缩算法。
客户端可以支持不同的压缩算法。某些客户端可能仅支持 Brotli 压缩,而其他客户端可能仅支持 Gzip 压缩。在这种情况下,您的服务器同时支持 Brotli 和 Gzip 压缩可能很重要。
您可以调整压缩级别以适合您。Brotli 和 Gzip 压缩提供程序默认为最快的压缩级别,这可能无法产生最有效的压缩。要更改这些设置,请执行以下操作:CompressionLevel.Fastest
builder.Services.Configure(options =>
{
options.Level = CompressionLevel.Fastest;
});
builder.Services.Configure(options =>
{
options.Level = CompressionLevel.SmallestSize;
});
注意:请务必根据您的需求定制压缩级别,并为您的应用选择最有效的方法。
CompressionLevel.Fastest 压缩应尽快完成,即使生成的输出未以最佳方式压缩。
CompressionLevel.NoCompression 不应执行任何压缩。
CompressionLevel.Optimal Responses 应以最佳方式压缩,即使压缩需要更多时间才能完成。
我们取得了什么成果?
让我们通过一个例子看看这种压缩方法有多大的好处。在这条路径中,我们将得到一直被鄙视的“GetWeatherForecast”API 的帮助,它是 .NET 的示例 API。
首先,让我们修改现成的方法,返回 20000 条数据。
[HttpGet(Name = "GetWeatherForecast")]
public IEnumerable Get()
{
return Enumerable.Range(1, 20000).Select(index => new WeatherForecast
{
Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
TemperatureC = Random.Shared.Next(\-20, 55),
Summary = Summaries\[Random.Shared.Next(Summaries.Length)\]
})
.ToArray();
}
然后检查此方法响应的大小:
无压缩响应大小
响应大小 1.5 MB
让我们用 和 设置来压缩响应:BrotliCompressinProviderCompressionLevel.SmallestSize
Brotli 和 SmallestSize 设置
图片
Brotoli 和最快设置
用 GzipCompressinProvider:
Gzip 和 SmallestSize 设置
Gzip 和最快设置
因此,平均而言,响应的大小减少了 11 倍(995/91.1=10.922),压缩率达 9%(91.1/995=0.091)。
当然,此功能也有缺点,如果您决定使用它,您应该考虑您的需求和资源,并相应地选择压缩方法和级别。
我们可以提到以下主要缺点:
CPU 负载: 压缩会增加服务器端的 CPU 使用率。压缩和解压缩数据需要时间,并且会消耗服务器资源。对于需要大量数据传输的高流量站点或应用程序,CPU 使用率可能会增加并影响服务器性能。
_ 延迟:_ 压缩和解压缩过程需要时间。服务器压缩数据后,将其发送到浏览器,浏览器对其进行解压缩。由于这些过程需要时间,因此可能会有一些延迟。对于互联网连接缓慢或较差的用户来说,这一点尤其明显。
_ 服务器资源:_ 压缩使用服务器端的资源。特别是当大量客户端同时请求压缩时,服务器资源可能不足。这可能会导致服务器性能降低或响应速度变慢。
_ 浏览器支持:_ 并非所有浏览器都支持压缩数据。特别是,较旧或不完整的浏览器无法解析压缩数据,因此无法正确显示压缩数据。在这种情况下,用户可能会遇到问题或内容格式不正确。