Dela via


Svarskomprimering i ASP.NET Core

Nätverksbandbredd är en begränsad resurs. Att minska storleken på svaret ökar vanligtvis svarstiden för en app, ofta dramatiskt. Ett sätt att minska nyttolaststorlekarna är att komprimera en apps svar.

Komprimering med HTTPS

Komprimerade svar över säkra anslutningar kan styras med EnableForHttps alternativet, som är inaktiverat som standard på grund av säkerhetsrisken. Om du använder komprimering med dynamiskt genererade sidor kan appen exponeras för CRIME och BREACH attacker. CRIME och BREACH attacker kan minimeras i ASP.NET Core med antiforgery-token. Mer information finns i Förhindra XSRF-/CSRF-attacker (Cross-Site Request Forgery) i ASP.NET Core. Information om hur du mildrar BREACH attacker, se åtgärderhttp://www.breachattack.com/

Även när EnableForHttps är inaktiverat i appen kan IIS, IIS Express och Azure App Service tillämpa gzip på IIS-webbservern. När du granskar svarshuvuden borde du anteckna Server-värdet. Ett oväntat content-encoding svarshuvudvärde kan vara resultatet av webbservern och inte ASP.NET Core-appkonfigurationen.

När du ska använda mellanprogram för svarskomprimering

Använd serverbaserade tekniker för svarskomprimering i IIS, Apache eller Nginx. Prestandan för svarskomprimeringsmellanprogrammet matchar förmodligen inte servermodulernas prestanda. HTTP.sys server och Kestrel server erbjuder för närvarande inte inbyggt komprimeringsstöd.

Använd Mellanprogram för svarskomprimering när appen är:

Svarskomprimering

Vanligtvis kan alla svar som inte komprimeras internt dra nytta av svarskomprimering. Svar som inte komprimeras internt omfattar vanligtvis CSS, JavaScript, HTML, XML och JSON. Komprimera inte internt komprimerade tillgångar, till exempel PNG-filer. När du försöker komprimera ett internt komprimerat svar ytterligare kommer eventuell liten extra minskning av storlek och överföringstid sannolikt att överskuggas av den tid det tar att bearbeta komprimering. Komprimera inte filer som är mindre än cirka 150–1 000 byte, beroende på filens innehåll och komprimeringseffektiviteten. Om du komprimerar små filer kan det uppstå en komprimerad fil som är större än den okomprimerade filen.

När en klient kan bearbeta komprimerat innehåll måste klienten informera servern om dess kapacitet genom att skicka Accept-Encoding huvudfältet i förfrågan. När en server skickar komprimerat innehåll måste den innehålla information i Content-Encoding rubriken om hur det komprimerade svaret kodas. Innehållskodningsbeteckningar som stöds av mellanprogrammet för svarskomprimering visas i följande tabell.

Accept-Encoding rubrikvärden Mellanprogram som stöds Description
br Ja (standard) Brotli-komprimerat dataformat
deflate No DEFLATE-komprimerat dataformat
exi No W3C Effektiv XML-utbyte
gzip Yes Gzip-filformat
identity Yes Identifierare för "Ingen kodning": Svaret får inte kodas.
pack200-gzip No Format för nätverksöverföring för Java-arkiv
* Yes All tillgänglig innehållskodning som inte uttryckligen begärs

Mer information finns i IANA:s officiella innehållskodningslista.

Med mellanprogrammet för svarskomprimering kan du lägga till ytterligare komprimeringsproviders för anpassade Accept-Encoding huvudvärden. Mer information finns i Anpassade leverantörer i den här artikeln.

Mellanprogrammet för svarskomprimering kan reagera på viktning av kvalitetsvärde (q-värde, q) när det skickas av klienten för att prioritera komprimeringsmetoder. Mer information finns i RFC 9110: Accept-Encoding.

Komprimeringsalgoritmer är föremål för en kompromiss mellan komprimeringshastigheten och komprimeringseffektiviteten. Effektivitet i det här sammanhanget refererar till storleken på utdata efter komprimering. Den minsta storleken uppnås genom optimal komprimering.

Rubrikerna som ingår i att begära, skicka, cachelagra och ta emot komprimerat innehåll beskrivs i följande tabell.

Header Role
Accept-Encoding Skickas från klienten till servern för att ange de innehållskodningsscheman som är godtagbara för klienten.
Content-Encoding Skickas från servern till klienten för att ange kodningen av innehållet i nyttolasten.
Content-Length När komprimering sker Content-Length tas rubriken bort eftersom brödtextinnehållet ändras när svaret komprimeras.
Content-MD5 När komprimering sker Content-MD5 tas rubriken bort eftersom brödtextinnehållet har ändrats och hashen inte längre är giltig.
Content-Type Anger MIME-typen för innehållet. Varje svar bör ange dess Content-Type. Mellanprogrammet för svarskomprimering kontrollerar det här värdet för att avgöra om svaret ska komprimeras. Mellanprogrammet för svarskomprimering anger en uppsättning MIME-standardtyper som kan kodas, och de kan läggas till eller ersättas.
Vary När den skickas av servern med värdet Accept-Encoding till klienter och proxyservrar anger Vary-rubriken för klienten eller proxyn att den ska cachelagra och variera svar baserat på värdet av Accept-Encoding-rubriken i begäran. Resultatet av att returnera innehåll med Vary: Accept-Encoding rubriken är att både komprimerade och okomprimerade svar cachelagras separat.

Utforska funktionerna i mellanprogrammet för svarskomprimering med exempelappen. Exemplet illustrerar:

  • Komprimering av applikationssvar med hjälp av Gzip och anpassade komprimeringsleverantörer.
  • Så här lägger du till en MIME-typ i standardlistan över MIME-typer för komprimering.
  • Så här lägger du till en anpassad svarskomprimeringsprovider.

Configuration

Följande kod visar hur du aktiverar mellanprogrammet för svarskomprimering för mime-standardtyper och komprimeringsproviders (Brotli och Gzip):

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddResponseCompression(options =>
{
    options.EnableForHttps = true;
});

var app = builder.Build();

app.UseResponseCompression();

app.MapGet("/", () => "Hello World!");

app.Run();

Notes:

Skicka en begäran till exempelappen Accept-Encoding utan rubriken och observera att svaret inte är komprimerat. Rubriken Content-Encoding finns inte i Response Headers-samlingen.

Till exempel i Firefox Developer:

  • Välj fliken Nätverk.
  • Högerklicka på begäran i listan Nätverksbegäran och välj Redigera och skicka igen
  • Ändra Accept-Encoding: från gzip, deflate, br till none.
  • Välj Skicka.

Skicka en begäran till exempelappen med en webbläsare med hjälp av utvecklarverktygen och observera att svaret är komprimerat. Rubrikerna Content-Encoding och Vary är närvarande i svaret.

Providers

Komprimeringsleverantörer för Brotli och Gzip

Använd BrotliCompressionProvider för att komprimera svar med Brotli-komprimerat dataformat.

Om inga komprimeringsleverantörer uttryckligen har lagts till i CompressionProviderCollection:

  • Brotli-komprimeringsprovidern och Gzip-komprimeringsprovidern läggs som standard till i matrisen med komprimeringsproviders.
  • Komprimering är standard för Brotli-komprimering när brotli-komprimerat dataformat stöds av klienten. Om Brotli inte stöds av klienten blir standardkomprimeringen Gzip, förutsatt att klienten stöder Gzip-komprimering.

Note

Dokumentationslänkar till .NET-referenskällan läser vanligtvis in lagringsplatsens standardgren, vilket representerar den aktuella utvecklingen för nästa version av .NET. Om du vill välja en tagg för en specifik version använder du listrutan Välj bland grenar eller taggar. Mer information finns i Så här väljer du en versionstagg för ASP.NET Core-källkod (dotnet/AspNetCore.Docs #26205).

När en komprimeringsprovider läggs till läggs inte andra leverantörer till. Om Gzip-komprimeringsprovidern till exempel är den enda providern som uttryckligen har lagts till läggs inga andra komprimeringsprovidrar till.

Följande kod:

  • Aktiverar svarskomprimering för HTTPS-begäranden.
  • Lägger till komprimeringsprovidrar för Brotli- och Gzip-svar.
using System.IO.Compression;
using Microsoft.AspNetCore.ResponseCompression;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddResponseCompression(options =>
{
    options.EnableForHttps = true;
    options.Providers.Add<BrotliCompressionProvider>();
    options.Providers.Add<GzipCompressionProvider>();
});

builder.Services.Configure<BrotliCompressionProviderOptions>(options =>
{
    options.Level = CompressionLevel.Fastest;
});

builder.Services.Configure<GzipCompressionProviderOptions>(options =>
{
    options.Level = CompressionLevel.SmallestSize;
});

var app = builder.Build();

app.UseResponseCompression();

app.MapGet("/", () => "Hello World!");

app.Run();

Ange komprimeringsnivån med BrotliCompressionProviderOptions och GzipCompressionProviderOptions. Komprimeringsleverantörer för Brotli och Gzip använder som standard den snabbaste komprimeringsnivån CompressionLevel.Fastest, vilket kanske inte ger den mest effektiva komprimeringen. Om den mest effektiva komprimering önskas konfigurerar du mellanprogrammet för svarskomprimering för optimal komprimering.

Se CompressionLevel Enum för värden som anger om en komprimeringsåtgärd betonar hastighet eller komprimeringsstorlek.

using System.IO.Compression;
using Microsoft.AspNetCore.ResponseCompression;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddResponseCompression(options =>
{
    options.EnableForHttps = true;
    options.Providers.Add<BrotliCompressionProvider>();
    options.Providers.Add<GzipCompressionProvider>();
});

builder.Services.Configure<BrotliCompressionProviderOptions>(options =>
{
    options.Level = CompressionLevel.Fastest;
});

builder.Services.Configure<GzipCompressionProviderOptions>(options =>
{
    options.Level = CompressionLevel.SmallestSize;
});

var app = builder.Build();

app.UseResponseCompression();

app.MapGet("/", () => "Hello World!");

app.Run();

Anpassade leverantörer

Skapa anpassade komprimeringsimplementeringar med ICompressionProvider. EncodingName Representerar den innehållskodning som detta ICompressionProvider skapar. Mellanprogrammet för svarskomprimering använder den här informationen för att välja providern baserat på listan som anges i Accept-Encoding rubriken för begäran.

Begäranden till exempelappen med Accept-Encoding: mycustomcompression-huvud returnerar ett svar med ett Content-Encoding: mycustomcompression-huvud. Klienten måste kunna dekomprimera den anpassade kodningen för att en anpassad komprimeringsimplementering ska fungera.

using Microsoft.AspNetCore.ResponseCompression;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddResponseCompression(options =>
{
    options.Providers.Add<BrotliCompressionProvider>();
    options.Providers.Add<GzipCompressionProvider>();
    options.Providers.Add<CustomCompressionProvider>();
});

var app = builder.Build();

app.UseResponseCompression();

app.MapGet("/", () => "Hello World!");

app.Run();
using Microsoft.AspNetCore.ResponseCompression;

public class CustomCompressionProvider : ICompressionProvider
{
    public string EncodingName => "mycustomcompression";
    public bool SupportsFlush => true;

    public Stream CreateStream(Stream outputStream)
    {
        // Replace with a custom compression stream wrapper.
        return outputStream;
    }
}

Med föregående kod komprimeras inte svarstexten av exemplet. Exemplet visar dock var du kan implementera en anpassad komprimeringsalgoritm.

MIME-typer

Mellanprogrammet för svarskomprimering anger en standarduppsättning MIME-typer för komprimering. Se källkoden för en fullständig lista över MIME-typer som stöds.

Note

Dokumentationslänkar till .NET-referenskällan läser vanligtvis in lagringsplatsens standardgren, vilket representerar den aktuella utvecklingen för nästa version av .NET. Om du vill välja en tagg för en specifik version använder du listrutan Välj bland grenar eller taggar. Mer information finns i Så här väljer du en versionstagg för ASP.NET Core-källkod (dotnet/AspNetCore.Docs #26205).

Ersätt eller lägg till MIME-typer med ResponseCompressionOptions.MimeTypes. Observera att MIME-typer med jokertecken, till exempel text/* inte stöds. Exempelappen lägger till en MIME-typ för image/svg+xml och komprimerar och hanterar ASP.NET Core-banderollsbilden banner.svg.

using Microsoft.AspNetCore.ResponseCompression;
using ResponseCompressionSample;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddResponseCompression(options =>
{
    options.EnableForHttps = true;
    options.Providers.Add<BrotliCompressionProvider>();
    options.Providers.Add<GzipCompressionProvider>();
    options.Providers.Add<CustomCompressionProvider>();
    options.MimeTypes =
    ResponseCompressionDefaults.MimeTypes.Concat(
        new[] { "image/svg+xml" });
});

var app = builder.Build();

app.UseResponseCompression();

Lägga till Vary-huvudet

När du komprimerar svar baserat på Accept-Encoding begärandehuvudet kan det finnas okomprimerade och flera komprimerade versioner av svaret. För att instruera klient- och proxycacheminnen om att flera versioner finns och bör lagras, läggs Vary-headern till med ett Accept-Encoding-värde. Svarsmellanprogrammet lägger till Vary header automatiskt när svaret komprimeras.

Note

Dokumentationslänkar till .NET-referenskällan läser vanligtvis in lagringsplatsens standardgren, vilket representerar den aktuella utvecklingen för nästa version av .NET. Om du vill välja en tagg för en specifik version använder du listrutan Välj bland grenar eller taggar. Mer information finns i Så här väljer du en versionstagg för ASP.NET Core-källkod (dotnet/AspNetCore.Docs #26205).

Problem med mellanprogram bakom en omvänd Nginx-proxy

När en begäran proxieras av Nginx tas Accept-Encoding huvud bort. Borttagning av Accept-Encoding-huvudet förhindrar att komprimerings-mellanvaran komprimerar svaret. Mer information finns i NGINX: Komprimering och dekomprimering. Det här problemet spåras av Ta reda på direktkomprimering för Nginx (dotnet/aspnetcore#5989).

Inaktivera dynamisk IIS-komprimering

Information om hur du inaktiverar dynamisk komprimeringsmodul för IIS som konfigurerats på servernivå finns i Inaktivera IIS-moduler.

Felsöka svarskomprimering

Använd ett verktyg som Firefox Browser Developer, som gör det möjligt att ange Accept-Encoding begärandehuvudet och studera svarshuvuden, storlek och brödtext. Som standard komprimerar Response Compression Middleware svar som uppfyller följande villkor:

  • Rubriken Accept-Encoding finns med värdet br, gzip, *eller anpassad kodning som matchar en anpassad komprimeringsprovider. Värdet får inte vara identity eller ha ett kvalitetsvärde (qvalue, q) inställning 0 (noll).
  • MIME-typen (Content-Type) måste anges och måste matcha en MIME-typ som konfigurerats på ResponseCompressionOptions.
  • Begäran får inte innehålla Content-Range rubriken.
  • Begäran måste använda osäkert protokoll (http), såvida inte säkert protokoll (https) har konfigurerats i alternativen för mellanprogram för svarskomprimering. Observera den fara som beskrivs ovan när du aktiverar säker innehållskomprimering.

Azure-distribuerat exempel

Exempelappen som distribueras till Azure har följande Program.cs fil:

using Microsoft.AspNetCore.ResponseCompression;
using ResponseCompressionSample;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddResponseCompression(options =>
{
    options.EnableForHttps = true;
    options.Providers.Add<BrotliCompressionProvider>();
    options.Providers.Add<GzipCompressionProvider>();
    options.Providers.Add<CustomCompressionProvider>();
    options.MimeTypes =
    ResponseCompressionDefaults.MimeTypes.Concat(
        new[] { "image/svg+xml" });
});

var app = builder.Build();

app.UseResponseCompression();

app.Map("/trickle", async (HttpResponse httpResponse) =>
{
    httpResponse.ContentType = "text/plain;charset=utf-8";

    for (int i = 0; i < 20; i++)
    {
        await httpResponse.WriteAsync("a");
        await httpResponse.Body.FlushAsync();
        await Task.Delay(TimeSpan.FromMilliseconds(50));
    }
});

app.Map("/testfile1kb.txt", () => Results.File(
    app.Environment.ContentRootFileProvider.GetFileInfo("testfile1kb.txt").PhysicalPath,
    "text/plain;charset=utf-8"));

app.Map("/banner.svg", () => Results.File(
    app.Environment.ContentRootFileProvider.GetFileInfo("banner.svg").PhysicalPath,
    "image/svg+xml;charset=utf-8"));

app.MapFallback(() => LoremIpsum.Text);

app.Run();

Ytterligare resurser

Note

Dokumentationslänkar till .NET-referenskällan läser vanligtvis in lagringsplatsens standardgren, vilket representerar den aktuella utvecklingen för nästa version av .NET. Om du vill välja en tagg för en specifik version använder du listrutan Välj bland grenar eller taggar. Mer information finns i Så här väljer du en versionstagg för ASP.NET Core-källkod (dotnet/AspNetCore.Docs #26205).

Nätverksbandbredd är en begränsad resurs. Att minska storleken på svaret ökar vanligtvis svarstiden för en app, ofta dramatiskt. Ett sätt att minska nyttolaststorlekarna är att komprimera en apps svar.

Visa eller ladda ned exempelkod (hur du laddar ned)

När du ska använda mellanprogram för svarskomprimering

Använd serverbaserade tekniker för svarskomprimering i IIS, Apache eller Nginx. Mellanprogrammets prestanda matchar förmodligen inte servermodulernas prestanda. HTTP.sys server och Kestrel server erbjuder för närvarande inte inbyggt komprimeringsstöd.

Använd mellanprogram för svarskomprimering när du:

Svarskomprimering

Vanligtvis kan alla svar som inte komprimeras internt dra nytta av svarskomprimering. Svar som inte komprimeras internt är vanligtvis: CSS, JavaScript, HTML, XML och JSON. Du bör inte komprimera naturligt komprimerade filer, till exempel PNG-filer. Om du försöker komprimera ett ursprungligen komprimerat svar ytterligare, kommer eventuella ytterligare små minskningar i storlek och överföringstid sannolikt att överskuggas av den tid det tog att bearbeta komprimeringen. Komprimera inte filer som är mindre än cirka 150–1 000 byte (beroende på filens innehåll och komprimeringseffektiviteten). Om du komprimerar små filer kan det uppstå en komprimerad fil som är större än den okomprimerade filen.

När en klient kan bearbeta komprimerat innehåll måste klienten informera servern om dess kapacitet genom att skicka Accept-Encoding huvudfältet i förfrågan. När en server skickar komprimerat innehåll måste den innehålla information i Content-Encoding rubriken om hur det komprimerade svaret kodas. Innehållskodningsbeteckningar som stöds av mellanprogrammet visas i följande tabell.

Accept-Encoding rubrikvärden Mellanprogram som stöds Description
br Ja (standard) Brotli-komprimerat dataformat
deflate No DEFLATE-komprimerat dataformat
exi No W3C Effektiv XML-utbyte
gzip Yes Gzip-filformat
identity Yes Identifierare för "Ingen kodning": Svaret får inte kodas.
pack200-gzip No Format för nätverksöverföring för Java-arkiv
* Yes All tillgänglig innehållskodning som inte uttryckligen begärs

Mer information finns i IANA:s officiella innehållskodningslista.

Med mellanprogrammet kan du lägga till ytterligare komprimeringsproviders för anpassade Accept-Encoding huvudvärden. Mer information finns i Anpassade leverantörer nedan.

Mellanprogramvaran kan reagera på viktningen av kvalitetsvärdet (qvalue, q) när det skickas av klienten för att kunna prioritera komprimeringsmetoder. Mer information finns i RFC 9110: Accept-Encoding.

Komprimeringsalgoritmer är föremål för en kompromiss mellan komprimeringshastigheten och komprimeringseffektiviteten. Effektivitet i det här sammanhanget refererar till storleken på utdata efter komprimering. Den minsta storleken uppnås med den mest optimala komprimering.

Rubrikerna för att begära, skicka, cachelagra och ta emot komprimerat innehåll beskrivs i tabellen nedan.

Header Role
Accept-Encoding Skickas från klienten till servern för att ange de innehållskodningsscheman som är godtagbara för klienten.
Content-Encoding Skickas från servern till klienten för att ange kodningen av innehållet i nyttolasten.
Content-Length När komprimering sker Content-Length tas rubriken bort eftersom brödtextinnehållet ändras när svaret komprimeras.
Content-MD5 När komprimering sker Content-MD5 tas rubriken bort eftersom brödtextinnehållet har ändrats och hashen inte längre är giltig.
Content-Type Anger MIME-typen för innehållet. Varje svar bör ange dess Content-Type. Mellanprogrammet kontrollerar det här värdet för att avgöra om svaret ska komprimeras. Mellanprogrammet anger en uppsättning MIME-standardtyper som kan kodas, men du kan ersätta eller lägga till MIME-typer.
Vary När den skickas av servern med värdet Accept-Encoding till klienter och proxyservrar anger Vary-rubriken för klienten eller proxyn att den ska cachelagra och variera svar baserat på värdet av Accept-Encoding-rubriken i begäran. Resultatet av att returnera innehåll med Vary: Accept-Encoding rubriken är att både komprimerade och okomprimerade svar cachelagras separat.

Utforska funktionerna i mellanprogrammet för svarskomprimering med exempelappen. Exemplet illustrerar:

  • Komprimering av applikationssvar med hjälp av Gzip och anpassade komprimeringsleverantörer.
  • Så här lägger du till en MIME-typ i standardlistan över MIME-typer för komprimering.

Configuration

Följande kod visar hur du aktiverar mellanprogrammet för svarskomprimering för mime-standardtyper och komprimeringsproviders (Brotli och Gzip):

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddResponseCompression();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseResponseCompression();
    }
}

Notes:

  • app.UseResponseCompression måste anropas innan all mellanprogramvara som komprimerar svar. Mer information finns i ASP.NET Core Middleware.
  • Använd ett verktyg som Fiddler, Firefox Browser Developer för att ange Accept-Encoding begärandehuvudet och studera svarshuvuden, storlek och brödtext.

Skicka en begäran till exempelappen Accept-Encoding utan rubriken och observera att svaret inte är komprimerat. Rubrikerna finns inte Content-Encoding och Vary i svaret.

Fiddler-fönstret visar resultatet av en begäran utan Accept-Encoding-huvudet. Svaret komprimeras inte.

Skicka en begäran till exempelappen med Accept-Encoding: br-huvudet som använder Brotli-komprimering, och observera att svaret är komprimerat. Rubrikerna Content-Encoding och Vary är närvarande i svaret.

Fiddler-fönstret visar resultatet av en begäran med Accept-Encoding-huvudet och värdet br. Rubrikerna Vary och Content-Encoding läggs till i svaret. Svaret komprimeras.

Providers

Brotli-komprimeringsleverantör

Använd BrotliCompressionProvider för att komprimera svar med Brotli-komprimerat dataformat.

Om inga komprimeringsprovidrar uttryckligen läggs till i CompressionProviderCollection:

  • Brotli-komprimeringsprovidern läggs som standard till i matrisen med komprimeringsprovider tillsammans med Gzip-komprimeringsprovidern.
  • Komprimering är standard för Brotli-komprimering när brotli-komprimerat dataformat stöds av klienten. Om Brotli inte stöds av klienten blir standardkomprimeringen Gzip, förutsatt att klienten stöder Gzip-komprimering.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();
}

Brotli-komprimeringsprovidern måste läggas till när någon komprimeringsprovider uttryckligen läggs till:

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}

Ange komprimeringsnivån med BrotliCompressionProviderOptions. Brotli-komprimeringsprovidern är som standard den snabbaste komprimeringsnivån (CompressionLevel.Fastest), vilket kanske inte ger den mest effektiva komprimeringsnivån. Om den mest effektiva komprimering önskas konfigurerar du mellanprogrammet för optimal komprimering.

Komprimeringsnivå Description
CompressionLevel.Fastest Komprimering bör slutföras så snabbt som möjligt, även om resultatet inte komprimeras optimalt.
CompressionLevel.NoCompression Ingen komprimering ska utföras.
CompressionLevel.Optimal Svar bör komprimeras optimalt, även om komprimering tar längre tid att slutföra.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();

    services.Configure<BrotliCompressionProviderOptions>(options => 
    {
        options.Level = CompressionLevel.Fastest;
    });
}

Gzip-komprimeringsprovider

GzipCompressionProvider Använd för att komprimera svar med Gzip-filformatet.

Om inga komprimeringsprovidrar uttryckligen läggs till i CompressionProviderCollection:

  • Gzip-komprimeringsprovidern läggs som standard till i matrisen med komprimeringsprovidrar tillsammans med Brotli Compression Provider.
  • Komprimering är standard för Brotli-komprimering när brotli-komprimerat dataformat stöds av klienten. Om Brotli inte stöds av klienten blir standardkomprimeringen Gzip, förutsatt att klienten stöder Gzip-komprimering.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();
}

Gzip-komprimeringsprovidern måste läggas till när någon komprimeringsprovider uttryckligen läggs till:

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}

Ange komprimeringsnivån med GzipCompressionProviderOptions. Gzip-komprimeringsprovidern är som standard den snabbaste komprimeringsnivån (CompressionLevel.Fastest), vilket kanske inte ger den mest effektiva komprimeringsnivån. Om den mest effektiva komprimering önskas konfigurerar du mellanprogrammet för optimal komprimering.

Komprimeringsnivå Description
CompressionLevel.Fastest Komprimering bör slutföras så snabbt som möjligt, även om resultatet inte komprimeras optimalt.
CompressionLevel.NoCompression Ingen komprimering ska utföras.
CompressionLevel.Optimal Svar bör komprimeras optimalt, även om komprimering tar längre tid att slutföra.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();

    services.Configure<GzipCompressionProviderOptions>(options => 
    {
        options.Level = CompressionLevel.Fastest;
    });
}

Anpassade leverantörer

Skapa anpassade komprimeringsimplementeringar med ICompressionProvider. EncodingName Representerar den innehållskodning som detta ICompressionProvider skapar. Mellanprogrammet använder den här informationen för att välja providern baserat på listan som anges i Accept-Encoding rubriken för begäran.

Med hjälp av exempelappen skickar klienten en begäran med Accept-Encoding: mycustomcompression-headern. Mellanprogrammet använder den anpassade komprimeringsimplementeringen och returnerar svaret med en Content-Encoding: mycustomcompression rubrik. Klienten måste kunna dekomprimera den anpassade kodningen för att en anpassad komprimeringsimplementering ska fungera.

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}
public class CustomCompressionProvider : ICompressionProvider
{
    public string EncodingName => "mycustomcompression";
    public bool SupportsFlush => true;

    public Stream CreateStream(Stream outputStream)
    {
        // Create a custom compression stream wrapper here
        return outputStream;
    }
}

Skicka en begäran till exempelappen Accept-Encoding: mycustomcompression med rubriken och observera svarshuvudena. Rubrikerna Vary och Content-Encoding är närvarande i svaret. Svarstexten (som inte visas) komprimeras inte av provet. Det finns ingen komprimeringsimplementering i CustomCompressionProvider exemplets klass. Exemplet visar dock var du skulle implementera en sådan komprimeringsalgoritm.

Fiddler-fönstret visar resultatet av en begäran med Accept-Encoding-huvudet och värdet mycustomcompression. Rubrikerna Vary och Content-Encoding läggs till i svaret.

MIME-typer

Mellanprogrammet anger en standarduppsättning med MIME-typer för komprimering:

  • application/javascript
  • application/json
  • application/xml
  • text/css
  • text/html
  • text/json
  • text/plain
  • text/xml

Byt ut eller komplettera MIME-typer med alternativen för Svarskomprimerings-mellanprogrammet. Observera att MIME-typer med jokertecken, till exempel text/* inte stöds. Exempelappen lägger till en MIME-typ för image/svg+xml och komprimerar och hanterar ASP.NET Core-banderollbilden (banner.svg).

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}

Komprimering med säkert protokoll

Komprimerade svar över säkra anslutningar kan styras med alternativet EnableForHttps , som är inaktiverat som standard. Att använda komprimering med dynamiskt genererade sidor kan leda till säkerhetsproblem såsom CRIME- och BREACH-attacker.

Lägga till Vary-huvudet

När du komprimerar svar baserat på Accept-Encoding rubriken finns det potentiellt flera komprimerade versioner av svaret och en okomprimerad version. För att instruera klient- och proxycacheminnen om att flera versioner finns och bör lagras, läggs Vary-headern till med ett Accept-Encoding-värde. I ASP.NET Core 2.0 eller senare lägger middleware automatiskt till Vary-huvudet när svaret komprimeras.

Problem med mellanprogram bakom en omvänd Nginx-proxy

När en begäran proxieras av Nginx tas Accept-Encoding huvud bort. Borttagning av Accept-Encoding-headern förhindrar att middleware komprimerar svaret. Mer information finns i NGINX: Komprimering och dekomprimering. Det här problemet spåras av Ta reda på direktkomprimering för Nginx (dotnet/aspnetcore#5989).

Arbeta med dynamisk IIS-komprimering

Om du har en aktiv dynamisk IIS-komprimeringsmodul konfigurerad på servernivå som du vill inaktivera för en app inaktiverar du modulen med ett tillägg till web.config-filen . Mer information finns i Inaktivera IIS-moduler.

Troubleshooting

Använd ett verktyg som Fiddler eller Firefox Browser Developer, som gör att du kan ange Accept-Encoding begärandehuvudet och studera svarshuvuden, storlek och brödtext. Som standard komprimerar Response Compression Middleware svar som uppfyller följande villkor:

  • Rubriken Accept-Encoding finns med värdet br, gzip, *eller anpassad kodning som matchar en anpassad komprimeringsprovider som du har upprättat. Värdet får inte vara identity eller ha ett kvalitetsvärde (qvalue, q) inställning 0 (noll).
  • MIME-typen (Content-Type) måste anges och måste matcha en MIME-typ som konfigurerats på ResponseCompressionOptions.
  • Begäran får inte innehålla Content-Range rubriken.
  • Begäran måste använda osäkert protokoll (http), såvida inte säkert protokoll (https) har konfigurerats i alternativen för mellanprogram för svarskomprimering. Observera den fara som beskrivs ovan när du aktiverar säker innehållskomprimering.

Ytterligare resurser