• 你知道.NET中的Response Compression中间件的用途吗?
  • 发布于 1个月前
  • 63 热度
    0 评论
  • 柠檬酸
  • 13 粉丝 56 篇博客
  •   
1. 什么是 Response Compression Middleware

Response Compression是 ASP.NET Core 提供的一种中间件,用于对 HTTP 响应内容进行压缩。它通过支持的压缩算法(如 Gzip 或 Brotli)压缩服务器发送给客户端的响应内容,从而加快网络传输速度,特别适合处理大段文本或数据。


2. 启用压缩中间件
压缩中间件默认提供了Brotli and Gzip算法
using Microsoft.Net.Http.Headers;
using Microsoft.Extensions.Primitives;
var builder = WebApplication.CreateBuilder();
//builder.Services.AddResponseCompression();
builder.Services.AddResponseCompression(options =>
{
    options.EnableForHttps = true; // 启用 HTTPS 的压缩
});
var app = builder.Build();
app.UseResponseCompression();
app.Run(async context =>
{
    var accept = context.Request.Headers[HeaderNames.AcceptEncoding];
    if (!StringValues.IsNullOrEmpty(accept))
    {
        context.Response.Headers.Append(HeaderNames.Vary, HeaderNames.AcceptEncoding);
    }
    context.Response.ContentType = "text/plain";
    var responseText = new string('A', 1000000); // 1,000,000 个字符
    await context.Response.WriteAsync(responseText);
});
app.Run();
注意:将 EnableForHttps 设置为 true 存在安全风险,通过设置EnableForHttps 选项可以控制安全连接上的压缩响应。然而,默认情况下该选项是禁用的,因为启用它存在安全风险。
安全风险:使用压缩和动态生成的页面可能会使应用程序暴露于CRIME 和BREACH 攻击中。
缓解措施:在 ASP.NET Core 中,可以通过使用防伪令牌(antiforgery tokens)来缓解这些攻击。

3. 配置压缩算法
我们启用日志来查看一下压缩算法:
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore.ResponseCompression": "Debug"
    }
  }
}

默认的算法使用了Brotli,我们可以配置一下算法
builder.Services.AddResponseCompression(options =>
{
    options.EnableForHttps = true; // 启用 HTTPS 的压缩
    options.Providers.Add<GzipCompressionProvider>();
});

我们也可以实现自己的算法,需要实现ICompressionProvider接口:
builder.Services.AddResponseCompression(options =>
{
    options.EnableForHttps = true; // 启用 HTTPS 的压缩
    //options.Providers.Add<GzipCompressionProvider>();
    options.Providers.Add<CustomCompressionProvider>();
});
using Microsoft.AspNetCore.ResponseCompression;
public class CustomCompressionProvider : ICompressionProvider
{
    public string EncodingName => "mycustomcompression";
    public bool SupportsFlush => true;
    public Stream CreateStream(Stream outputStream)
    {
        // 堆代码 duidaima.com
        return outputStream;
    }
}

用户评论