tag net mac component asp and c# asp.net-core decompression asp.net-core-middleware

c# - mac - Solicitar descompresión de contenido en ASP.Net Core



tag helpers asp net core (2)

El middleware y los servicios de Compression de respuesta se proporcionan OOB en ASPNETCORE.

Puede usar el paquete de nuget Microsoft.AspNetCore.ResponseCompression siguiendo las instrucciones en los documentos oficiales de ASPNETCORE .

A veces necesito publicar cargas útiles de solicitud JSON más grandes en mis controladores centrales de ASP.Net. El tamaño de la carga útil lo justifica (al menos en mi opinión) comprimirlo. Debido a que ASP.Net Core Controllers no parece ser compatible con el contenido comprimido de las solicitudes de forma inmediata, he implementado mi propio middleware.

Implementar esto fue tan trivial que no estoy seguro de si me estoy perdiendo algo aquí. ¿Ya sea porque hay una forma integrada de lograr esto o porque cometí un gran error desde el punto de vista de seguridad o rendimiento?

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