在ASP.Net Core中请求内容解压缩

Oli*_*old 24 c# compression asp.net-core asp.net-core-middleware

我有时需要将更大的JSON请求有效负载发布到我的ASP.Net核心控制器.有效载荷的大小保证(至少在我看来)压缩它.由于ASP.Net核心控制器似乎不支持开箱即用的压缩请求内容,因此我推出了自己的中间件.

实现这个是微不足道的,我不确定我是否在这里遗漏了一些东西.要么是因为有一种内置的方法来实现这一目标,要么是因为我从安全性或性能角度出现了一些重大错误?

public class GzipRequestContentEncodingMiddleware
{
    public GzipRequestContentEncodingMiddleware(RequestDelegate next)
    {
        if (next == null)
            throw new ArgumentNullException(nameof(next));

        this.next = next;
    }

    private readonly RequestDelegate next;
    private const string ContentEncodingHeader = "Content-Encoding";
    private const string ContentEncodingGzip = "gzip";
    private const string ContentEncodingDeflate = "deflate";

    public async Task Invoke(HttpContext context)
    {
        if (context.Request.Headers.Keys.Contains(ContentEncodingHeader) &&
            (context.Request.Headers[ContentEncodingHeader] == ContentEncodingGzip || 
            context.Request.Headers[ContentEncodingHeader] == ContentEncodingDeflate))
        {
            var contentEncoding = context.Request.Headers[ContentEncodingHeader];
            context.Request.Headers.Remove(ContentEncodingHeader);

            var destination = new MemoryStream();

            using (var decompressor = contentEncoding == ContentEncodingGzip
                ? (Stream) new GZipStream(context.Request.Body, CompressionMode.Decompress, true)
                : (Stream) new DeflateStream(context.Request.Body, CompressionMode.Decompress, true))
            {
                await decompressor.CopyToAsync(destination);
            }

            destination.Seek(0, SeekOrigin.Begin);
            context.Request.Body = destination;
            context.Request.Headers["Content-Length"] = destination.Length.ToString(CultureInfo.InvariantCulture);
        }

        await next(context);
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 8

我知道这是一篇很老的帖子,但以防万一它对某人有帮助,这里有一个 nuget 包,用于在 .net 核心中执行请求解压缩

https://github.com/alexanderkozlenko/aspnetcore-request-decompression


小智 -6

ASPNETCORE 中提供了 OOB 响应压缩中间件和服务。

您可以按照ASPNETCORE 官方文档上的说明使用Microsoft.AspNetCore.ResponseCompression nuget 包。

  • OP 询问的是解压缩请求,而不是压缩响应。提供的中间件只做后者,不做前者。 (6认同)