当前位置: 首页 > article >正文

ASP.NET Core 自定义解压缩提供程序

写在前面

在了解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发送的请求成功被服务端的自定义解压缩提供程序处理了。


http://www.kler.cn/a/226911.html

相关文章:

  • 两个重要极限【高数笔记】
  • Java面试——计网篇
  • 假期刷题打卡--Day22
  • svg基础(一)
  • 微信小程序(三十一)本地同步存储API
  • Android battery saver 简单记录
  • GrayLog踩坑历险记
  • 微信小程序实现吸顶、网格、瀑布流布局
  • C++初阶 内存管理和模板
  • WordPress可以做企业官网吗?如何用wordpress建公司网站?
  • [Python] opencv - 什么是直方图?如何绘制图像的直方图?
  • 2021-07-02 51单片机按键控制LED灯逐个点亮
  • Unity_Shader
  • STC系列单片机定时器
  • aspose-words字体替换功能2
  • STL——空间配置器
  • C# 浅克隆与深克隆
  • JavaWeb01-JDBC、Druid连接池
  • Rust 第一个rust程序Hello Rust️
  • Leveraging Jexl in JavaScript: Practical Scenarios and Code Examples