Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.Net内核中的请求内容解压缩_C#_Asp.net Core_Compression_Asp.net Core Middleware - Fatal编程技术网

C# ASP.Net内核中的请求内容解压缩

C# ASP.Net内核中的请求内容解压缩,c#,asp.net-core,compression,asp.net-core-middleware,C#,Asp.net Core,Compression,Asp.net Core Middleware,有时我需要将更大的JSON请求有效负载发布到我的ASP.Net核心控制器。有效负载的大小保证了(至少在我看来)压缩它。因为ASP.Net核心控制器似乎不支持开箱即用的压缩请求内容,所以我推出了自己的中间件 实现这一点非常简单,我不确定我是否遗漏了什么。要么是因为有一个内置的方法来实现这一点,要么是因为我从安全或性能的角度犯了一些重大错误 public class GzipRequestContentEncodingMiddleware { public GzipRequestConten

有时我需要将更大的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);
    }
}

响应压缩中间件和服务由ASPNETCORE中的OOB提供


您可以按照上的说明使用nuget包

我知道这是一篇相当古老的文章,但为了以防万一,如果它对某人有所帮助,这里有一个nuget包,用于在.net core中执行请求解压缩


对我来说似乎很合适。但是你真的需要内存流吗?如果您将压缩流分配给请求主体,它也应该工作。这个请求无论如何都不可倒带。但代码评审在这个问题上是离题的SO@Tseng当我按照你的建议短路时,它就起作用了。但这也意味着我必须编辑内容长度头,我无法用这种方法预测其值,我不确定这是否违反了HTTP协议。如果您正在寻找对代码的意见,您应该将您的问题提交给代码审阅()。这与堆栈溢出无关。为什么要重新发明轮子,试试看。。。OP的可能副本是询问有关解压缩请求的问题,而不是压缩响应的问题。提供的中间件只执行后者,而不执行前者。只需询问这是否也处理zlib的解压缩?