La compressione della risposta invia sempre Vary: Accept-Encoding

Il middleware di compressione della risposta ora aggiunge Vary: Accept-Encoding a ogni risposta che lo attraversa, incluse le risposte per le quali in realtà non comprime il corpo della risposta. Le cache downstream visualizzano chiavi della cache più corrette, a costo di varianti di cache leggermente maggiori quando le cache non normalizzano l'intestazione della Accept-Encoding richiesta.

Versione introdotta

.NET 11

Comportamento precedente

In precedenza, il middleware di compressione delle risposte accodò Vary: Accept-Encoding solo alle risposte effettivamente compresse. Risposte per cui la compressione è stata ignorata, ad esempio perché il tipo di contenuto non era in MimeTypeso perché la codifica preferita identity dal client, è stata inviata senza l'intestazione Vary aggiunta dal middleware.

Una cache downstream potrebbe quindi servire a un client che accetta solo identity una risposta compressa archiviata per Accept-Encoding: gzip (e viceversa), a meno che la cache o l'origine non abbiano già aggiunto l'intestazione in altro modo.

Nuovo comportamento

A partire da ASP.NET Core 11, il middleware di compressione della risposta aggiunge Vary: Accept-Encoding alla raccolta di intestazioni di risposta per ogni risposta che vede, indipendentemente dal fatto che il corpo sia compresso o meno. Se l'intestazione contiene Accept-Encodinggià , il middleware non aggiunge un token duplicato.

Tipo di cambiamento che interrompe la compatibilità

Questa modifica è una modifica funzionale.

Motivo della modifica

Senza l'intestazione Vary: Accept-Encoding in ogni risposta, una cache condivisa può servire una risposta codificata archiviata a un client che non accetta tale codifica. L'aggiunta incondizionata dell'intestazione rende la risposta del middleware correttamente memorizzabile nella cache dagli intermediari conformi a HTTP. Per altre informazioni, vedere dotnet/aspnetcore#55092 e il problema risolto, dotnet/aspnetcore#48008.

Non è necessaria alcuna modifica al testo di origine. Verificare che qualsiasi cache downstream (rete CDN, proxy inverso, cache del browser) normalizzi l'intestazione della Accept-Encoding richiesta in modo che non archivii un numero inutilmente elevato di varianti. La maggior parte delle reti CDN moderne esegue già questa operazione.

Se non si vuole che il middleware aggiunga l'intestazione a una risposta specifica, rimuoverla dopo l'esecuzione del 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();
});

Le API interessate