La compresión de respuestas siempre envía Vary: Accept-Encoding

El middleware de compresión de respuesta ahora anexa Vary: Accept-Encoding a cada respuesta que pasa por ella, incluidas las respuestas para las que realmente no comprimía el cuerpo. Las cachés descendentes obtienen claves de caché más correctas, a costa de generar ligeramente más variantes de caché cuando las cachés no normalizan la cabecera de indicación Accept-Encoding.

Versión introducida

.NET 11

Comportamiento anterior

Anteriormente, el middleware de compresión de respuestas solo añadía Vary: Accept-Encoding a las respuestas que realmente comprimía. Las respuestas para las que se omitió la compresión (por ejemplo, porque el tipo de contenido no estaba en MimeTypeso porque el cliente prefiere identity codificación) se enviaron sin el encabezado agregado por el Vary middleware.

Por lo tanto, una caché descendente podría servir una respuesta comprimida que se almacenó para Accept-Encoding: gzip a un cliente que solo aceptaba identity (y viceversa), a menos que la caché o el origen ya hubieran añadido el encabezado por otro medio.

Nuevo comportamiento

A partir de ASP.NET Core 11, el middleware de compresión de respuestas agrega Vary: Accept-Encoding a la colección de cabeceras de respuesta en todas las respuestas que procesa, independientemente de si comprimió o no el cuerpo de la respuesta. Si el encabezado ya contiene Accept-Encoding, el middleware no agrega un token duplicado.

Tipo de cambio disruptivo

Este es un cambio de comportamiento.

Motivo del cambio

Sin el Vary: Accept-Encoding encabezado de cada respuesta, una caché compartida puede servir una respuesta codificada almacenada a un cliente que no acepta esa codificación. Agregar el encabezado incondicionalmente hace que la respuesta del middleware se pueda almacenar en caché correctamente mediante intermediarios compatibles con HTTP. Para obtener más información, vea dotnet/aspnetcore#55092 y el problema que corrige, dotnet/aspnetcore#48008.

No se requiere ningún cambio de origen. Compruebe que cualquier caché de bajada (CDN, proxy inverso, caché del explorador) normaliza el Accept-Encoding encabezado de solicitud para que no almacene un número innecesario de variantes. La mayoría de las redes CDN modernas ya lo hacen.

Si no desea que el middleware agregue el encabezado a una respuesta específica, quítelo después de que se ejecute el middleware:

app.UseResponseCompression();

app.Use(async (context, next) =>
{
    context.Response.OnStarting(() =>
    {
        // Remove the Vary header added by UseResponseCompression for a specific path.
        if (context.Request.Path.StartsWithSegments("/no-vary"))
        {
            context.Response.Headers.Remove("Vary");
        }
        return Task.CompletedTask;
    });
    await next();
});

Las APIs afectadas