web-dev-qa-db-ja.com

ASP.Net Coreでコンテンツの解凍を要求する

ASP.Netコアコントローラーに、より大きなJSONリクエストペイロードを投稿する必要がある場合があります。ペイロードのサイズは、(少なくとも私の意見では)それを圧縮することを保証します。 ASP.Net Coreコントローラーはそのままでは圧縮されたリクエストコンテンツをサポートしていないようなので、独自のミドルウェアを導入しました。

これを実装するのは非常に簡単だったので、ここで何か不足しているかどうかはわかりません。これを達成するための組み込みの方法があるためか、セキュリティまたはパフォーマンスの観点から大きなミスを犯したためですか?

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

これはかなり古い投稿であることは知っていますが、誰かに役立つ場合に備えて、.netコアでリクエスト圧縮解除を実行するためのnugetパッケージを以下に示します

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

3
Narendra Chava