ASP.NET Core 6+ 默认不启用响应压缩,需显式注册Provider(如AddBrotli/AddGzip)、调用UseResponseCompression()中间件,并配置MimeTypes(如添加"application/json")、MinLength和EnableForHttps等参数。

ASP.NET Core 6+ 默认不启用任何响应压缩,AddResponseCompression() 只注册服务骨架,不自动注入 GzipCompressionProvider 或 BrotliCompressionProvider;没手动加 Provider,客户端发 Accept-Encoding: br 或 gzip 都会被无视——响应里压根不会出现 Content-Encoding 头。
为什么加了 AddResponseCompression() 还是不压缩?
常见错误是只调用了服务注册,但漏掉 Provider 注入或中间件启用。尤其在 .NET 6+ 中,BrotliCompressionProvider 已不再随 AddResponseCompression() 自动注册。
- 必须显式调用
options.Providers.Add或() AddBrotli()(.NET 6+ 扩展方法) -
app.UseResponseCompression()必须放在app.UseRouting()之后、app.UseEndpoints()或app.UseAuthorization()之前 - 若用
UseStaticFiles(),它默认绕过整个中间件管道,UseResponseCompression()对其无效——静态文件需另配OnPrepareResponse手动加Vary: Accept-Encoding,但内容本身不压缩
application/json 响应为啥没被压缩?
默认 MIME 类型白名单不含 application/json,只包括 text/plain、text/css、application/javascript 等。哪怕你启用了 Gzip/Brotli,JSON 响应照样明文返回。
- 必须扩展
MimeTypes:用ResponseCompressionDefaults.MimeTypes.Concat(new[] { "application/json" }) - 不要直接 new string[] —— 会覆盖默认类型,导致 CSS/JS 也不再压缩
- 注意大小写:
application/json是标准写法,Application/Json不匹配
Brotli 和 Gzip 的优先级怎么控制?
压缩算法选择不看客户端 Accept-Encoding 里的逗号顺序(如 br,gzip),而完全取决于 ResponseCompressionOptions.Providers 列表中的注册顺序:排前面的 Provider 优先匹配。
- 想让 Brotli 优先,就把
AddBrotli()放在AddGzip()前面 - .NET 6+ 推荐用
builder.Services.AddResponseCompression(options => { options.Providers.AddBrotli(); options.Providers.AddGzip(); }) -
EnableForHttps = true仅解除 HTTPS 下的默认禁用,不是“强制压缩”——是否真压缩,还取决于 MIME 类型、响应体长度(默认MinLength = 2048)、Provider 是否匹配
MinLength 和 EnableForHttps 容易踩哪些坑?
MinLength 设太小(比如 100),会导致小 JSON 响应(如 {"ok":true})被反复压缩,反而增大体积;设太大(比如 10000),又错过大量中等尺寸响应的优化机会。
- 建议保持默认 2048,或保守设为 1024
-
EnableForHttps = true存在 BREACH 攻击风险,尤其当响应含用户敏感数据且使用防伪令牌不足时;生产环境若后端有 Nginx 等反向代理统一处理压缩,此处应设为false避免重复压缩 -
EnableForHttps不影响算法选择逻辑,它只开关“HTTPS 响应能否进压缩流程”,和 Brotli/Gzip 谁生效无关
最常被忽略的一点:Brotli 在 .NET Framework 上不可用,必须确认运行时是 .NET Core 3.0+ 或 .NET 5+;若目标环境是 Windows Server 2012 + .NET Framework 4.8,强行注册 BrotliCompressionProvider 会静默失败或抛 PlatformNotSupportedException。











