写在前面
在了解ASP.NET Core 自定义请求解压缩中间件的应用时,依据官方文档操作下来碰到了几个问题,这边做个记录。
关键点就是配置 Content-Encoding,参数需要和代码中添加的提供程序的Key保持一致;
builder.Services.AddRequestDecompression(options =>
{
options.DecompressionProviders.Add("custom", new CustomDecompressionProvider());
});
比如,上面的代码段设置了Key 为 custom的自定义解压缩提供程序,在发起请求时的Headers中就必须包含 Content-Encoding = custom 的键值对,这样服务端才会得到匹配的依据,然后进入自定义的解压缩程序代码中。
Postman的请求头部信息配置如下:
此外还有一个关键点,就是在处理请求流数据的时候,需要配置一下支持同步读流,否则会异步读取异常。
// 配置支持同步读流
builder.Services.Configure<KestrelServerOptions>(x => x.AllowSynchronousIO = true)
.Configure<IISServerOptions>(x => x.AllowSynchronousIO = true);
代码实现
using Microsoft.AspNetCore.RequestDecompression;
using Microsoft.AspNetCore.Server.Kestrel.Core;var builder = WebApplication.CreateBuilder(args);builder.Services.AddRequestDecompression(options =>
{options.DecompressionProviders.Add("custom", new CustomDecompressionProvider());
});// 配置支持同步读流
builder.Services.Configure<KestrelServerOptions>(x => x.AllowSynchronousIO = true).Configure<IISServerOptions>(x => x.AllowSynchronousIO = true);var app = builder.Build();app.UseRequestDecompression();app.MapPost("/", (HttpRequest request) => Results.Stream(request.Body));app.Run();public class CustomDecompressionProvider : IDecompressionProvider
{public Stream GetDecompressionStream(Stream stream){// 在这里添加自定的解压缩逻辑代码using (StreamReader reader = new StreamReader(stream)){// 异步读流var data = reader.ReadToEndAsync();Console.WriteLine(data.Result);}return stream;}
}
调用示例
由Postman发送的请求成功被服务端的自定义解压缩提供程序处理了。