在ASP.NET Core应用中,响应压缩功能默认提供了基础的支持,但在实际生产场景中,往往需要更灵活的配置来适配不同的业务需求,比如自定义压缩算法、控制压缩范围、调整压缩级别等,这些进阶配置可以进一步提升应用的传输性能。

基础响应压缩的启用
首先我们需要在服务中注册响应压缩服务,然后在中间件管道中启用响应压缩。基础配置代码如下:
// Program.cs 中的基础配置
var builder = WebApplication.CreateBuilder(args);
// 注册响应压缩服务
builder.Services.AddResponseCompression(options =>
{
options.EnableForHttps = true; // 启用HTTPS场景下的压缩
});
var app = builder.Build();
// 启用响应压缩中间件,注意要放在UseStaticFiles之前
app.UseResponseCompression();
app.MapGet("/", () => "Hello World!");
app.Run();
进阶配置:自定义压缩提供者
默认的响应压缩只支持Brotli和Gzip两种算法,如果需要支持其他压缩算法,或者自定义压缩的行为,可以实现IBrotliCompressionProvider或者IGzipCompressionProvider,也可以自定义全新的压缩提供者。
自定义Gzip压缩级别
默认的Gzip压缩使用默认的压缩级别,我们可以通过自定义Gzip压缩提供者来调整压缩级别,平衡压缩率和CPU消耗:
using Microsoft.AspNetCore.ResponseCompression;
using System.IO.Compression;
// 自定义Gzip压缩提供者
public class CustomGzipCompressionProvider : ICompressionProvider
{
// 压缩提供者的名称,对应请求头中的Accept-Encoding值
public string EncodingName => "gzip";
// 是否支持内容类型,这里返回true表示支持所有类型
public bool SupportsFlush => true;
// 创建压缩流
public Stream CreateStream(Stream outputStream, CompressionLevel compressionLevel)
{
// 自定义压缩级别为最优压缩
return new GZipStream(outputStream, CompressionLevel.Optimal);
}
}
然后在服务注册时替换默认的Gzip提供者:
builder.Services.AddResponseCompression(options =>
{
options.EnableForHttps = true;
// 移除默认的Gzip提供者
options.Providers.RemoveType<GzipCompressionProvider>();
// 添加自定义的Gzip提供者
options.Providers.Add<CustomGzipCompressionProvider>();
});
添加自定义压缩算法支持
如果需要支持比如Deflate之外的自定义算法,只需要实现ICompressionProvider接口即可,以下是一个简单的自定义压缩提供者示例:
using Microsoft.AspNetCore.ResponseCompression;
using System.IO.Compression;
public class CustomDeflateCompressionProvider : ICompressionProvider
{
public string EncodingName => "deflate";
public bool SupportsFlush => true;
public Stream CreateStream(Stream outputStream, CompressionLevel compressionLevel)
{
return new DeflateStream(outputStream, compressionLevel);
}
}
进阶配置:控制压缩范围
默认情况下,响应压缩会对大部分文本类型的响应进行压缩,但有些场景下我们需要排除特定类型的响应,或者只对特定请求启用压缩。
排除指定MIME类型的响应
可以通过配置ResponseCompressionOptions的MimeTypes属性来指定需要压缩的MIME类型,或者排除不需要压缩的类型:
builder.Services.AddResponseCompression(options =>
{
options.EnableForHttps = true;
// 指定需要压缩的MIME类型,默认已经包含常见的文本类型
options.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(
new[] { "application/json", "application/xml", "text/html" }
);
// 排除不需要压缩的类型,比如已经压缩过的图片
options.ExcludedMimeTypes = new[] { "image/jpeg", "image/png", "image/gif" };
});
基于请求特征动态启用压缩
如果需要根据请求的特定特征(比如请求头、路径等)动态决定是否启用压缩,可以自定义IResponseCompressionProvider接口的实现:
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.ResponseCompression;
using Microsoft.Extensions.Options;
public class CustomResponseCompressionProvider : IResponseCompressionProvider
{
private readonly ResponseCompressionOptions _options;
public CustomResponseCompressionProvider(IOptions<ResponseCompressionOptions> options)
{
_options = options.Value;
}
// 判断是否应该对当前响应进行压缩
public bool ShouldCompress(HttpContext context)
{
// 如果请求路径包含/api,则启用压缩,其他路径不压缩
if (context.Request.Path.StartsWithSegments("/api"))
{
return true;
}
// 也可以基于请求头判断,比如没有携带特定请求头则不压缩
if (context.Request.Headers.ContainsKey("X-No-Compress"))
{
return false;
}
return _options.DefaultCompressionLevel != null;
}
// 获取对应的压缩提供者
public ICompressionProvider? GetCompressionProvider(HttpContext context)
{
// 根据请求头中的Accept-Encoding选择对应的提供者
var acceptEncoding = context.Request.Headers.AcceptEncoding.ToString();
foreach (var provider in _options.Providers)
{
if (acceptEncoding.Contains(provider.EncodingName, StringComparison.OrdinalIgnoreCase))
{
return provider;
}
}
return null;
}
}
注册自定义提供者:
// 替换默认的响应压缩提供者 builder.Services.Replace(ServiceDescriptor.Singleton<IResponseCompressionProvider, CustomResponseCompressionProvider>());
进阶配置:压缩级别与性能平衡
压缩级别越高,压缩后的体积越小,但消耗的CPU资源越多,我们可以根据不同的场景设置不同的压缩级别:
builder.Services.AddResponseCompression(options =>
{
options.EnableForHttps = true;
// 设置默认压缩级别为快速压缩,平衡CPU和压缩率
options.DefaultCompressionLevel = CompressionLevel.Fastest;
// 也可以针对不同的提供者设置不同的压缩级别,比如在自定义提供者中指定
});
注意事项
- 响应压缩中间件应该放在
UseStaticFiles之前,否则静态文件不会被压缩 - 已经压缩过的内容(比如图片、压缩包)再次压缩不会有明显效果,反而浪费CPU,建议排除这些类型的响应
- HTTPS场景下启用压缩需要注意是否开启
EnableForHttps,默认是关闭的 - 压缩会消耗一定的CPU资源,在高并发场景下需要根据服务器性能调整压缩级别
通过上述进阶配置,我们可以根据实际项目的需求灵活调整ASP.NET Core的响应压缩策略,在传输效率和服务器性能之间找到最适合的平衡点。
ASP.NET_CoreResponse_CompressionC#中间件性能优化修改时间:2026-06-23 12:36:36