Tengo Nginx proxy inverso de mi servicio que funciona con el protocolo OData. Estoy tratando de habilitar la compresión para estas solicitudes poniendo
#... gzip on; gzip_types application/json; #... server { #... location /odata/ { proxy_pass http://localhost:7700/odata/; } #... }en nginx.conf.
A veces mi servicio regresa
Tipo de contenido: aplicación/json; juego de caracteres=utf-8; odata.metadata=mínimo
y Nginx lo comprime.
Pero a veces mi servicio vuelve
Tipo de contenido: aplicación/json; odata.metadata=mínimo; odata.transmisión=verdadero; conjunto de caracteres = utf-8
y Nginx no comprime tales respuestas.
¿Qué debo hacer para permitir que Nginx comprima tales respuestas?
Resolví este problema escribiendo middleware en mi aplicación, que cambia el encabezado de tipo de contenido y lo transforma en application/json; charset=utf-8; odata.metadata=minimal; odata.streaming=true;
Después de eso, Nginx podría reconocerlo como tipo de contenido json y comprimirlo.
Permítanme agregar mi solución para ASP.NET Core.
Sin embargo, tenga en cuenta que estas respuestas están fragmentadas, por lo que el parámetro gzip_min_length de Nginx no funcionará y las respuestas pequeñas también se comprimirán, lo que aumentará el tamaño y reducirá el rendimiento.
/// <summary> /// Middleware to reorder Content-Type parts for Nginx compression. /// </summary> public class FixODataMiddlewareForNginx { readonly RequestDelegate _next; public FixODataMiddlewareForNginx(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext context) { context.Response.OnStarting(() => { var contentType = context.Response.GetTypedHeaders().ContentType; if (contentType != null && contentType.Parameters.Count > 0 && !contentType.Charset.HasValue) { contentType.Parameters.Insert(0, new NameValueHeaderValue("charset", "utf-8")); context.Response.Headers["Content-Type"] = contentType.ToString(); } return Task.CompletedTask; }); await _next.Invoke(context); } }