簡體   English   中英

在 ASP.Net Core 中請求內容解壓

[英]Request content decompression in ASP.Net Core

我有時需要將較大的 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);
    }
}

我知道這是一篇很老的帖子,但以防萬一它對某人有幫助,這是一個 nuget 包,用於在 .net 核心中執行請求解壓縮

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

.NET 7 Preview 6中引入了一個新的中間件,它使用 Content-Encoding HTTP 標頭自動識別和解壓縮帶有壓縮內容的請求,這樣服務器的開發人員就不需要自己處理這個問題。 使用IApplicationBuilder UseRequestDecompression方法和IServiceCollection上的AddRequestDecompression擴展方法添加請求解壓中間件。

響應壓縮中間件和服務在 ASPNETCORE 中提供 OOB。

您可以按照ASPNETCORE 官方文檔中的說明使用Microsoft.AspNetCore.ResponseCompression nuget 包。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM