ASP.NET Core 知识速递 - Day 11:Compression 中间件

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

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.IsOrEmpty(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;});

我们也可以实现自己的算法,需要实现ICompressionProvider接口:

builder.Services.AddResponseCompression(options =>{ options.EnableForHttps = true; // 启用 HTTPS 的压缩 //options.Providers.Add; options.Providers.Add;});using Microsoft.AspNetCore.ResponseCompression;public class CustomCompressionProvider : ICompressionProvider{ public string EncodingName => "mycustomcompression"; public bool SupportsFlush => true; public Stream CreateStream(Stream outputStream) { // Replace with a custom compression stream wrapper. return outputStream; }}

源代码地址

来源:opendotnet

相关推荐