导读:本期聚焦于小伙伴创作的《C#怎么实现请求响应压缩_C# ASP.NET Core响应压缩配置【进阶】》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C#怎么实现请求响应压缩_C# ASP.NET Core响应压缩配置【进阶】》有用,将其分享出去将是对创作者最好的鼓励。

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

C#怎么实现请求响应压缩_C# 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类型的响应

可以通过配置ResponseCompressionOptionsMimeTypes属性来指定需要压缩的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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。