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);

代码实现

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

相关推荐
咚为6 小时前
Rust Print 终极指南:从底层原理到全场景实战
开发语言·后端·rust
二哈喇子!6 小时前
基于Spring Boot框架的车库停车管理系统的设计与实现
java·spring boot·后端·计算机毕业设计
Loo国昌9 小时前
【LangChain1.0】第九阶段:文档处理工程 (LlamaIndex)
人工智能·后端·python·算法·langchain
毕设源码-朱学姐10 小时前
【开题答辩全过程】以 基于SpringBoot的律师事务所管理系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
愈努力俞幸运10 小时前
flask 入门 token, headers,cookie
后端·python·flask
毕设源码-朱学姐10 小时前
【开题答辩全过程】以 基于springboot的日用药品仓库管理系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
lkbhua莱克瓦2412 小时前
深入理解HTTP协议:从理论到SpringBoot实践
网络·笔记·后端·网络协议·http·javaweb
古城小栈12 小时前
Rust复合类型 四大军阀:数、元、切、串
开发语言·后端·rust
+VX:Fegn089514 小时前
计算机毕业设计|基于springboot + vue酒店预订系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
JavaGuide14 小时前
IntelliJ IDEA 2026.1 EAP 发布!拥抱 Java 26,Spring Boot 4 深度支持!
java·后端·mysql·springboot·idea·大厂面试·javaguide