Komprese odpovědí v ASP.NET Core

Šířka pásma sítě je omezený prostředek. Zmenšením velikosti odpovědi se obvykle výrazně zvyšuje rychlost odezvy aplikace. Jedním ze způsob, jak zmenšit velikosti datové části, je zkomprimovat odpovědi aplikace.

Zobrazení nebo stažení ukázkového kódu (stažení)

Kdy použít middleware pro kompresi odpovědí

Používejte serverové technologie komprese odpovědí ve službě IIS, Apache nebo Nginx. Výkon middlewaru se pravděpodobně neshoduje s výkonem serverových modulů. HTTP.sys server a Kestrel server v současné době nepodporují integrovanou kompresi.

Middleware pro kompresi odpovědí použijte v případě, že:

Komprese odpovědí

Komprese odpovědí může být obvykle výhodná pro všechny odpovědi, které nejsou nativně komprimované. Mezi odpovědi, které nejsou nativně komprimované, obvykle patří: CSS, JavaScript, HTML, XML a JSON. Neměli byste komprimovat nativně komprimované prostředky, jako jsou soubory PNG. Pokud se pokusíte dále komprimovat nativně komprimovanou odpověď, jakékoli malé zkrácení velikosti a doby přenosu bude pravděpodobně zastíněn časem zpracování komprese. Komprimujte soubory menší než přibližně 150–1 000 bajtů (v závislosti na obsahu souboru a efektivitě komprese). Režie při komprimaci malých souborů může způsobit, že komprimovaný soubor bude větší než nekomprimovaný soubor.

Pokud klient může zpracovat komprimovaný obsah, klient musí informovat server o svých možnostech odesláním Accept-Encoding hlavičky s požadavkem. Když server odesílá komprimovaný obsah, musí v hlavičce obsahovat informace o kódování Content-Encoding komprimované odpovědi. Označení kódování obsahu podporovaná middlewarem jsou uvedena v následující tabulce.

Accept-Encoding hodnoty hlaviček Podporovaný middleware Description
br Ano (výchozí) Formát dat komprimovaný pomocí brotli
deflate No Formát komprimovaných dat DEFLATE
exi No W3C Efficient XML Interchange
gzip Yes Formát souboru Gzip
identity Yes Identifikátor "Bez kódování": Odpověď nesmí být kódovaná.
pack200-gzip No Formát síťového přenosu pro archivy Java
* Yes Jakékoli dostupné kódování obsahu není explicitně požadováno.

Další informace najdete v oficiálním seznamu kódování obsahu IANA.

Middleware umožňuje přidat další zprostředkovatele komprese pro vlastní Accept-Encoding hodnoty hlaviček. Další informace najdete níže v části Vlastní zprostředkovatelé.

Middleware dokáže reagovat na váhu kvality (qvalue, ) po odeslání klientem za účelem q stanovení priority schémat komprese. Další informace najdete v dokumentu RFC 7231: Accept-Encoding.

Kompresní algoritmy podléhají kompromisu mezi rychlostí komprese a účinností komprese. Efektivita v tomto kontextu odkazuje na velikost výstupu po kompresi. Nejmenší velikosti dosáhnete nejoptimálnější kompresí.

Hlavičky, které se podílejí na vyžádání, odesílání, ukládání do mezipaměti a příjmu komprimovaného obsahu, jsou popsány v následující tabulce.

Hlavička Role
Accept-Encoding Odesílá se z klienta na server, aby indikuje, že schémata kódování obsahu jsou pro klienta přijatelná.
Content-Encoding Odesílá se ze serveru do klienta, aby indikuje kódování obsahu v datové části.
Content-Length Když dojde ke kompresi, hlavička se odebere, protože obsah těla se Content-Length změní, když je odpověď komprimovaná.
Content-MD5 Pokud dojde ke kompresi, hlavička se odebere, protože se obsah těla Content-MD5 změnil a hodnota hash už není platná.
Content-Type Určuje typ MIME obsahu. Každá odpověď by měla zadat svůj Content-Type . Middleware zkontroluje tuto hodnotu a určí, jestli má být odpověď komprimovaná. Middleware určuje sadu výchozích typů MIME, které může kódovat, ale můžete je nahradit nebo přidat.
Vary Při odeslání serverem s hodnotou do klientů a proxy serverů hlavička klientovi nebo proxy serveru indikuje, že by měl ukládat odpovědi do mezipaměti (různé) na základě hodnoty hlavičky Accept-Encoding Vary Accept-Encoding požadavku. Výsledkem vrácení obsahu se záhlavím je, že komprimované i nekomprimované odpovědi jsou Vary: Accept-Encoding uloženy do mezipaměti samostatně.

Prozkoumejte funkce middlewaru Response Compression s ukázkovou aplikací. Ukázka znázorňuje:

  • Komprese odpovědí aplikací pomocí Gzip a vlastních poskytovatelů komprese.
  • Jak přidat typ MIME do výchozího seznamu typů MIME pro kompresi.

Balíček

Middleware pro kompresi odpovědí poskytuje balíček Microsoft.AspNetCore.ResponseCompression, který je implicitně součástí ASP.NET Core aplikací.

Konfigurace

Následující kód ukazuje, jak povolit middleware komprese odpovědí pro výchozí typy MIME a poskytovatele komprese(Brotli a Gzip):

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

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

Poznámky:

  • app.UseResponseCompression musí být volána před middlewarem, který komprimuje odpovědi. Další informace naleznete v tématu ASP.NET Core Jiné.
  • K nastavení hlavičky požadavku a prostudování hlaviček, velikosti a textu odpovědi použijte nástroj, jako je Fiddler, Firefox Browser Developernebo Postman. Accept-Encoding

Odešlete požadavek do ukázkové aplikace bez hlavičky a všimněte si, Accept-Encoding že odpověď není dekomprimovaná. Hlavičky Content-Encoding a v odpovědi nejsou k Vary dispozici.

Okno Fiddleru zobrazující výsledek požadavku bez Accept-Encoding záhlaví Odpověď není komprimovaná.

Odešlete požadavek do ukázkové aplikace s hlavičkou (komprese Brotli) a všimněte si, že Accept-Encoding: br je odpověď komprimovaná. V Content-Encoding odpovědi Vary jsou hlavičky a .

Okno Fiddleru zobrazující výsledek požadavku s Accept-Encoding hlavičkou a hodnotou br. Do odpovědi se přidávají hlavičky Vary a Content-Encoding. Odpověď je komprimovaná.

Zprostředkovatelé

Zprostředkovatel komprese Brotli

Pomocí BrotliCompressionProvider zkomprimujte odpovědi pomocí datového formátu komprimovaného brotli.

Pokud nejsou do souboru explicitně přidáni žádní poskytovatelé CompressionProviderCollection komprese:

  • Zprostředkovatel komprese Brotli se ve výchozím nastavení přidá do pole poskytovatelů komprese společně s poskytovatelem komprese Gzip.
  • Komprese ve výchozím nastavení využívá kompresi Brotli, pokud klient podporuje komprimovaný formát dat Brotli. Pokud klient brotli nepodporuje, komprese gzip se použije jako výchozí, pokud klient podporuje kompresi Gzip.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();
}

Pokud jsou explicitně přidáni poskytovatelé komprese Brotli Compression Provider, musí být přidán:

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

Nastavte úroveň komprese pomocí BrotliCompressionProviderOptions . Zprostředkovatel komprese Brotli ve výchozím nastavení využívá nejrychlejší úroveň komprese (CompressionLevel.Fastest),která nemusí být nejefektivnější. Pokud potřebujete nejefektivnější kompresi, nakonfigurujte middleware pro optimální kompresi.

Úroveň komprese Description
CompressionLevel. nejrychlejší Komprese by měla být dokončena co nejrychleji, a to i v případě, že výsledný výstup není optimálně komprimován.
CompressionLevel. uncompression Není nutné provádět kompresi.
CompressionLevel. optimální Odpovědi by se měly optimálně komprimovat, a to i v případě, že je komprese delší dobu trvat.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();

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

Zprostředkovatel komprese GZip

Použijte GzipCompressionProvider pro komprimaci odpovědí ve formátu souboru gzip.

Pokud nejsou explicitně přidány žádní zprostředkovatelé komprese do CompressionProviderCollection :

  • Zprostředkovatel komprese GZip je ve výchozím nastavení přidán k poli zprostředkovatelů komprese společně s poskytovatelem Brotli Compression.
  • Komprese se nastaví jako výchozí Brotli komprese, když klient podporuje formát komprimovaných dat Brotli. Pokud klient nepodporuje Brotli, komprese je standardně nastavená na gzip, když klient podporuje kompresi gzip.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();
}

Zprostředkovatel komprese GZip se musí přidat, když se explicitně přidají poskytovatelé komprese:

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

Nastavte úroveň komprese pomocí GzipCompressionProviderOptions . Zprostředkovatel komprese GZip je výchozím nastavením nejrychlejší kompresní úrovně (CompressionLevel. nejrychlejší), což nemusí způsobovat nejúčinnější kompresi. Pokud je žádoucí co nejúčinnější komprese, nakonfigurujte middleware pro optimální kompresi.

Úroveň komprese Description
CompressionLevel. nejrychlejší Komprese by měla být dokončena co nejrychleji, a to i v případě, že výsledný výstup není optimálně komprimován.
CompressionLevel. uncompression Není nutné provádět kompresi.
CompressionLevel. optimální Odpovědi by se měly optimálně komprimovat, a to i v případě, že je komprese delší dobu trvat.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();

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

Vlastní poskytovatelé

Vytvořte vlastní implementace komprese pomocí ICompressionProvider . EncodingNamePředstavuje kódování obsahu, které ICompressionProvider vytváří. Middleware používá tyto informace k výběru poskytovatele založeného na seznamu zadaném v Accept-Encoding hlavičce žádosti.

Pomocí ukázkové aplikace klient odesílá požadavek s Accept-Encoding: mycustomcompression hlavičkou. Middleware používá vlastní kompresní implementaci a vrací odpověď s Content-Encoding: mycustomcompression hlavičkou. Aby mohla vlastní implementace komprese fungovat, musí být klient schopný dekomprimovat vlastní kódování.

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

Odešlete žádost do ukázkové aplikace s Accept-Encoding: mycustomcompression hlavičkou a sledujte hlavičky odpovědi. V Vary Content-Encoding odpovědi jsou k dispozici hlavičky a. Text odpovědi (nezobrazený) není ukázkou komprimován. Ve třídě ukázky neexistuje žádná implementace komprese CustomCompressionProvider . Nicméně Ukázka ukazuje, kde byste takový kompresní algoritmus implementovali.

Fiddler okno znázorňující výsledek požadavku s hlavičkou Accept-Encoding a hodnotou mycustomcompression. K odpovědi se přidají záhlaví Vary a kódování obsahu.

typy MIME

Middleware určuje výchozí sadu typů MIME pro kompresi:

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

Nahraďte nebo připojovat typy MIME pomocí možností middlewaru pro kompresi odpovědí. Všimněte si, že zástupné typy MIME se text/* nepodporují. ukázková aplikace přidá typ MIME pro image/svg+xml a zkomprimuje a zachová ASP.NET Core obrázek banneru (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" });
    });
}

Komprese pomocí zabezpečeného protokolu

Komprimované odpovědi přes zabezpečená připojení se dají řídit pomocí EnableForHttps Možnosti, která je ve výchozím nastavení zakázaná. Použití komprese s dynamicky generovanými stránkami může vést k problémům se zabezpečením, jako jsou trestné činy a útoky za porušení .

Přidávání záhlaví Vary

Při komprimaci odpovědí na základě Accept-Encoding záhlaví může být potenciálně více komprimovaných verzí odpovědi a nekomprimovaná verze. Aby bylo možné zadat do mezipamětí klienta a proxy serveru, že existuje více verzí a měl by být uložen, Vary Hlavička je přidána s Accept-Encoding hodnotou. v ASP.NET Core 2,0 nebo novější middleware přidá Vary hlavičku automaticky, když je odpověď komprimovaná.

Problém middlewaru, když za Nginx reverzní proxy

Když požadavek vyNginx proxy serverem, Accept-Encoding Hlavička se odebere. Odebrání Accept-Encoding hlavičky brání middlewaru v komprimaci odpovědi. Další informace naleznete v tématu Nginx: Compression a decompression. Tento problém je sledován pomocí předávací komprese pro Nginx (ASPNET/BasicMiddleware #123).

Práce s dynamickou kompresí služby IIS

Pokud máte aktivní dynamický kompresní modul služby IIS nakonfigurovaný na úrovni serveru, který chcete pro aplikaci zakázat, zakažte modul s přidáním do souboru web.config . Další informace najdete v tématu zakázání modulů IIS.

Řešení potíží

Použijte nástroj, jakoje Fiddler, vývojář prohlížeče Firefox nebo autor, který vám umožní nastavit Accept-Encoding hlavičku požadavku a prozkoumat hlavičky, velikost a text odpovědi. Ve výchozím nastavení middleware pro komprimaci odezvy komprimuje odezvy, které splňují následující podmínky:

  • Accept-EncodingHlavička je přítomna s hodnotou br , gzip , * nebo vlastní kódování, které odpovídá vlastnímu poskytovateli komprese, který jste navázali. Hodnota nesmí být identity nebo mít hodnotu kvality (qvalue, q ) nastavenou na 0 (nula).
  • Typ MIME ( Content-Type ) musí být nastaven a musí odpovídat typu MIME nakonfigurovanému v ResponseCompressionOptions .
  • Požadavek nesmí obsahovat Content-Range hlavičku.
  • Požadavek musí používat protokol HTTP (nezabezpečený protokol), pokud není v možnostech middleware pro kompresi odpovědí nakonfigurovaný protokol HTTPS (Secure Protocol). Při povolování komprese zabezpečeného obsahu si všimněte výše popsaného nebezpečí.

Další zdroje informací

Šířka pásma sítě je omezeného prostředku. Zmenšení velikosti odpovědi obvykle zvyšuje rychlost odezvy aplikace, často výrazně. Jedním ze způsobů, jak omezit velikost datových částí, je komprimace reakcí aplikace.

Zobrazit nebo stáhnout ukázkový kód (Jak stáhnout)

Kdy použít middleware pro kompresi odpovědí

Používejte technologie pro kompresi odpovědí na základě serveru ve službě IIS, Apache nebo Nginx. Výkon middleware se pravděpodobně neshoduje s modulem serverových modulů. Server HTTP.sys Server a Kestrel Server aktuálně nenabízejí integrovanou podporu komprese.

Používejte middleware pro kompresi odpovědí, pokud jste:

Komprese odpovědí

Obvykle by jakákoli odpověď, která není nativně komprimovaná, mohla využívat kompresi odpovědi. Odpovědi, které nejsou nativně zkomprimované, obvykle zahrnují: CSS, JavaScript, HTML, XML a JSON. Neměli byste komprimovat nativně komprimované prostředky, jako jsou soubory PNG. Pokusíte-li se dále komprimovat nativně komprimovanou odpověď, jakékoli malé další snížení velikosti a čas přenosu budou pravděpodobně převrženy časem, který trvalo zpracování komprese. Nekomprimuje soubory menší než přibližně 150-1000 bajtů (v závislosti na obsahu souboru a efektivitě komprese). Režie komprimace malých souborů může vytvořit komprimovaný soubor, který je větší než nekomprimovaný soubor.

Když klient může zpracovat komprimovaný obsah, klient musí informovat Server svých schopností odesláním Accept-Encoding hlavičky s požadavkem. Když server pošle komprimovaný obsah, musí obsahovat informace v Content-Encoding záhlaví způsobu, jakým je komprimovaná odpověď zakódovaná. V následující tabulce jsou uvedena označení kódování obsahu podporovaná middlewarem.

Accept-Encoding hodnoty hlaviček Podporovaný middleware Description
br Ano (výchozí) Formát dat komprimovaný pomocí brotli
deflate No Formát komprimovaných dat DEFLATE
exi No W3C Efficient XML Interchange
gzip Yes Formát souboru Gzip
identity Yes Identifikátor "Bez kódování": Odpověď nesmí být kódovaná.
pack200-gzip No Formát síťového přenosu pro archivy Java
* Yes Jakékoli dostupné kódování obsahu není explicitně požadováno.

Další informace najdete v oficiálním seznamu kódování obsahu IANA.

Middleware umožňuje přidat další zprostředkovatele komprese pro vlastní Accept-Encoding hodnoty hlaviček. Další informace najdete níže v části Vlastní zprostředkovatelé.

Middleware dokáže reagovat na váhu kvality (qvalue, ) po odeslání klientem za účelem q stanovení priority schémat komprese. Další informace najdete v dokumentu RFC 7231: Accept-Encoding.

Kompresní algoritmy podléhají kompromisu mezi rychlostí komprese a efektivitou komprese. Efektivita v tomto kontextu odkazuje na velikost výstupu po kompresi. Nejmenší velikosti dosáhnete nejoptimálnější kompresí.

Hlavičky, které se podílejí na vyžádání, odesílání, ukládání do mezipaměti a příjmu komprimovaného obsahu, jsou popsány v následující tabulce.

Hlavička Role
Accept-Encoding Odesílá se z klienta na server, aby indikuje, že schémata kódování obsahu jsou pro klienta přijatelná.
Content-Encoding Odesílá se ze serveru do klienta, aby indikuje kódování obsahu v datové části.
Content-Length Když dojde ke kompresi, hlavička se odebere, protože obsah těla se Content-Length změní, když je odpověď komprimovaná.
Content-MD5 Pokud dojde ke kompresi, hlavička se odebere, protože se obsah těla Content-MD5 změnil a hodnota hash už není platná.
Content-Type Určuje typ MIME obsahu. Každá odpověď by měla zadat svůj Content-Type . Middleware zkontroluje tuto hodnotu a určí, jestli má být odpověď komprimovaná. Middleware určuje sadu výchozích typů MIME, které může kódovat, ale můžete je nahradit nebo přidat.
Vary Při odeslání serverem s hodnotou do klientů a proxy serverů hlavička klientovi nebo proxy serveru indikuje, že by měl ukládat odpovědi do mezipaměti (různé) na základě hodnoty hlavičky Accept-Encoding Vary Accept-Encoding požadavku. Výsledkem vrácení obsahu se záhlavím je, že komprimované i nekomprimované odpovědi jsou uloženy Vary: Accept-Encoding do mezipaměti samostatně.

Prozkoumejte funkce middlewaru pro kompresi odpovědí pomocí ukázkové aplikace. Ukázka znázorňuje:

  • Komprese odpovědí aplikací pomocí Gzip a vlastních poskytovatelů komprese.
  • Jak přidat typ MIME do výchozího seznamu typů MIME pro kompresi.

Balíček

Pokud chcete middleware zahrnout do projektu, přidejte odkaz na Microsoft.AspNetCore.App metapackage, který obsahuje balíček Microsoft.AspNetCore.ResponseCompression.

Konfigurace

Následující kód ukazuje, jak povolit middleware komprese odpovědí pro výchozí typy MIME a poskytovatele komprese(Brotli a Gzip):

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

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

Poznámky:

  • app.UseResponseCompression musí být volána před middlewarem, který komprimuje odpovědi. Další informace naleznete v tématu ASP.NET Core Jiné.
  • K nastavení hlavičky požadavku a prostudování hlaviček, velikosti a textu odpovědi použijte nástroj, jako je Fiddler, Firefox Browser Developernebo Postman. Accept-Encoding

Odešlete požadavek do ukázkové aplikace bez hlavičky a všimněte si, Accept-Encoding že odpověď není dekomprimovaná. Hlavičky Content-Encoding a v odpovědi nejsou k Vary dispozici.

Okno Fiddleru zobrazující výsledek požadavku bez Accept-Encoding záhlaví Odpověď není komprimovaná.

Odešlete požadavek do ukázkové aplikace s hlavičkou (komprese Brotli) a všimněte si, že Accept-Encoding: br je odpověď komprimovaná. V Content-Encoding odpovědi Vary jsou hlavičky a .

Okno Fiddleru zobrazující výsledek požadavku s Accept-Encoding hlavičkou a hodnotou br. Do odpovědi se přidávají hlavičky Vary a Content-Encoding. Odpověď je komprimovaná.

Zprostředkovatelé

Zprostředkovatel komprese Brotli

Pomocí BrotliCompressionProvider zkomprimujte odpovědi pomocí datového formátu komprimovaného brotli.

Pokud nejsou do souboru explicitně přidáni žádní poskytovatelé CompressionProviderCollection komprese:

  • Zprostředkovatel komprese Brotli se ve výchozím nastavení přidá do pole poskytovatelů komprese společně s poskytovatelem komprese Gzip.
  • Komprese ve výchozím nastavení využívá kompresi Brotli, pokud klient podporuje komprimovaný formát dat Brotli. Pokud klient brotli nepodporuje, komprese gzip se použije jako výchozí, pokud klient podporuje kompresi Gzip.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();
}

Pokud jsou explicitně přidáni poskytovatelé komprese Brotli Compression Provider, musí být přidán:

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

Nastavte úroveň komprese pomocí BrotliCompressionProviderOptions . Zprostředkovatel komprese Brotli ve výchozím nastavení využívá nejrychlejší úroveň komprese (CompressionLevel.Fastest),která nemusí být nejefektivnější. Pokud potřebujete nejefektivnější kompresi, nakonfigurujte middleware pro optimální kompresi.

Úroveň komprese Description
CompressionLevel.Fastest Komprese by se měla dokončit co nejrychleji, i když výsledný výstup není optimálně komprimovaný.
CompressionLevel.NoCompression Neměla by se provádět žádná komprese.
CompressionLevel.Optimal Odpovědi by měly být optimálně komprimované, i když dokončení komprese trvá déle.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();

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

Zprostředkovatel komprese GZip

Pomocí GzipCompressionProvider zkomprimujte odpovědi ve formátu souboru Gzip.

Pokud nejsou do souboru explicitně přidáni žádní poskytovatelé CompressionProviderCollection komprese:

  • Zprostředkovatel komprese Gzip se ve výchozím nastavení přidá do pole poskytovatelů komprese společně s poskytovatelem komprese Brotli.
  • Komprese ve výchozím nastavení využívá kompresi Brotli, pokud klient podporuje komprimovaný formát dat Brotli. Pokud klient brotli nepodporuje, komprese gzip se použije jako výchozí, pokud klient podporuje kompresi Gzip.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();
}

Poskytovatele komprese Gzip je nutné přidat, když jsou explicitně přidáni poskytovatelé komprese:

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

Nastavte úroveň komprese pomocí GzipCompressionProviderOptions . Zprostředkovatel komprese Gzip ve výchozím nastavení využívá nejrychlejší úroveň komprese(CompressionLevel.Fastest),která nemusí být nejefektivnější. Pokud potřebujete nejefektivnější kompresi, nakonfigurujte middleware pro optimální kompresi.

Úroveň komprese Description
CompressionLevel.Fastest Komprese by se měla dokončit co nejrychleji, i když výsledný výstup není optimálně komprimovaný.
CompressionLevel.NoCompression Neměla by se provádět žádná komprese.
CompressionLevel.Optimal Odpovědi by měly být optimálně komprimované, i když dokončení komprese trvá déle.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();

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

Vlastní poskytovatelé

Vytvořte vlastní implementace komprese pomocí ICompressionProvider . EncodingNamepředstavuje kódování obsahu, které to ICompressionProvider vytvoří. Middleware používá tyto informace k výběru poskytovatele na základě seznamu zadaného v Accept-Encoding hlavičce požadavku.

Pomocí ukázkové aplikace klient odešle požadavek s Accept-Encoding: mycustomcompression hlavičkou . Middleware používá vlastní kompresní implementaci a vrací odpověď s Content-Encoding: mycustomcompression hlavičkou. Aby mohla vlastní implementace komprese fungovat, musí být klient schopný dekomprimovat vlastní kódování.

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

Odešlete žádost do ukázkové aplikace s Accept-Encoding: mycustomcompression hlavičkou a sledujte hlavičky odpovědi. V Vary Content-Encoding odpovědi jsou k dispozici hlavičky a. Text odpovědi (nezobrazený) není ukázkou komprimován. Ve třídě ukázky neexistuje žádná implementace komprese CustomCompressionProvider . Nicméně Ukázka ukazuje, kde byste takový kompresní algoritmus implementovali.

Fiddler okno znázorňující výsledek požadavku s hlavičkou Accept-Encoding a hodnotou mycustomcompression. K odpovědi se přidají záhlaví Vary a kódování obsahu.

typy MIME

Middleware určuje výchozí sadu typů MIME pro kompresi:

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

Nahraďte nebo připojovat typy MIME pomocí možností middlewaru pro kompresi odpovědí. Všimněte si, že zástupné typy MIME se text/* nepodporují. ukázková aplikace přidá typ MIME pro image/svg+xml a zkomprimuje a zachová ASP.NET Core obrázek banneru (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" });
    });
}

Komprese pomocí zabezpečeného protokolu

Komprimované odpovědi přes zabezpečená připojení se dají řídit pomocí EnableForHttps Možnosti, která je ve výchozím nastavení zakázaná. Použití komprese s dynamicky generovanými stránkami může vést k problémům se zabezpečením, jako jsou trestné činy a útoky za porušení .

Přidávání záhlaví Vary

Při komprimaci odpovědí na základě Accept-Encoding záhlaví může být potenciálně více komprimovaných verzí odpovědi a nekomprimovaná verze. Aby bylo možné zadat do mezipamětí klienta a proxy serveru, že existuje více verzí a měl by být uložen, Vary Hlavička je přidána s Accept-Encoding hodnotou. v ASP.NET Core 2,0 nebo novější middleware přidá Vary hlavičku automaticky, když je odpověď komprimovaná.

Problém middlewaru, když za Nginx reverzní proxy

Když požadavek vyNginx proxy serverem, Accept-Encoding Hlavička se odebere. Odebrání Accept-Encoding hlavičky brání middlewaru v komprimaci odpovědi. Další informace naleznete v tématu Nginx: Compression a decompression. Tento problém je sledován pomocí předávací komprese pro Nginx (ASPNET/BasicMiddleware #123).

Práce s dynamickou kompresí služby IIS

Pokud máte aktivní dynamický kompresní modul služby IIS nakonfigurovaný na úrovni serveru, který chcete pro aplikaci zakázat, zakažte modul s přidáním do souboru web.config . Další informace najdete v tématu zakázání modulů IIS.

Řešení potíží

Použijte nástroj, jakoje Fiddler, vývojář prohlížeče Firefox nebo autor, který vám umožní nastavit Accept-Encoding hlavičku požadavku a prozkoumat hlavičky, velikost a text odpovědi. Ve výchozím nastavení middleware pro komprimaci odezvy komprimuje odezvy, které splňují následující podmínky:

  • Accept-EncodingHlavička je přítomna s hodnotou br , gzip , * nebo vlastní kódování, které odpovídá vlastnímu poskytovateli komprese, který jste navázali. Hodnota nesmí být identity nebo mít hodnotu kvality (qvalue, q ) nastavenou na 0 (nula).
  • Typ MIME ( Content-Type ) musí být nastaven a musí odpovídat typu MIME nakonfigurovanému v ResponseCompressionOptions .
  • Požadavek nesmí obsahovat Content-Range hlavičku.
  • Požadavek musí používat protokol HTTP (nezabezpečený protokol), pokud není v možnostech middleware pro kompresi odpovědí nakonfigurovaný protokol HTTPS (Secure Protocol). Při povolování komprese zabezpečeného obsahu si všimněte výše popsaného nebezpečí.

Další zdroje informací

Šířka pásma sítě je omezeného prostředku. Zmenšení velikosti odpovědi obvykle zvyšuje rychlost odezvy aplikace, často výrazně. Jedním ze způsobů, jak omezit velikost datových částí, je komprimace reakcí aplikace.

Zobrazit nebo stáhnout ukázkový kód (Jak stáhnout)

Kdy použít middleware pro kompresi odpovědí

Používejte technologie pro kompresi odpovědí na základě serveru ve službě IIS, Apache nebo Nginx. Výkon middleware se pravděpodobně neshoduje s modulem serverových modulů. Server HTTP.sys Server a Kestrel Server aktuálně nenabízejí integrovanou podporu komprese.

Používejte middleware pro kompresi odpovědí, pokud jste:

Komprese odpovědí

Obvykle by jakákoli odpověď, která není nativně komprimovaná, mohla využívat kompresi odpovědi. Odpovědi, které nejsou nativně zkomprimované, obvykle zahrnují: CSS, JavaScript, HTML, XML a JSON. Neměli byste komprimovat nativně komprimované prostředky, jako jsou soubory PNG. Pokusíte-li se dále komprimovat nativně komprimovanou odpověď, jakékoli malé další snížení velikosti a čas přenosu budou pravděpodobně převrženy časem, který trvalo zpracování komprese. Nekomprimuje soubory menší než přibližně 150-1000 bajtů (v závislosti na obsahu souboru a efektivitě komprese). Režie komprimace malých souborů může vytvořit komprimovaný soubor, který je větší než nekomprimovaný soubor.

Když klient může zpracovat komprimovaný obsah, klient musí informovat Server svých schopností odesláním Accept-Encoding hlavičky s požadavkem. Když server pošle komprimovaný obsah, musí obsahovat informace v Content-Encoding záhlaví způsobu, jakým je komprimovaná odpověď zakódovaná. V následující tabulce jsou uvedena označení kódování obsahu podporovaná middlewarem.

Accept-Encoding hodnoty hlaviček Middleware – podporováno Popis
br No Formát komprimovaných dat Brotli
deflate No Formát ZÚŽENé komprese dat
exi No Efektivní výměna XML pro W3C
gzip Ano (výchozí) Formát souboru gzip
identity Yes Identifikátor "bez kódování": odpověď nesmí být kódovaná.
pack200-gzip No Formát přenosu v síti pro archivy Java
* Yes Jakékoli dostupné kódování obsahu není explicitně požadováno.

Další informace najdete v seznamu kódů oficiálního obsahu IANA.

Middleware umožňuje přidat další zprostředkovatele komprese pro vlastní Accept-Encoding hodnoty hlaviček. Další informace najdete v tématu Vlastní zprostředkovatelé níže.

Middleware je schopná chovat hodnoty kvality (qvalue q ), když je klient odesílá k určení priorit schémat komprese. Další informace najdete v dokumentu RFC 7231: Accept-Encoding.

Algoritmy komprese se vztahují na kompromisy mezi rychlostí komprese a efektivitou komprese. Efektivita v tomto kontextu odkazuje na velikost výstupu po kompresi. Nejmenší velikost dosáhne optimální komprese.

Hlavičky zahrnuté v tématu vyžádání, odeslání, ukládání do mezipaměti a příjem komprimovaného obsahu jsou popsány v následující tabulce.

Hlavička Role
Accept-Encoding Odesílá se z klienta na server k označení schémat kódování obsahu, které jsou přijatelné pro klienta.
Content-Encoding Odesílá se ze serveru do klienta, aby označovala kódování obsahu v datové části.
Content-Length Když dojde k komprimaci, Content-Length Hlavička se odebere, protože obsah těla se změní, když je odpověď komprimovaná.
Content-MD5 Když dojde k komprimaci, Content-MD5 Hlavička se odebere, protože se změnil obsah těla a hodnota hash již není platná.
Content-Type Určuje typ MIME obsahu. Každá odpověď by měla specifikovat svůj Content-Type . Middleware kontroluje tuto hodnotu, aby určila, jestli by měla být komprimovaná odpověď. Middleware určuje sadu výchozích typů MIME , které může kódovat, ale můžete nahradit nebo přidat typy MIME.
Vary Při odeslání serverem s hodnotou Accept-Encoding pro klienty a proxy servery Vary indikuje hlavička klientovi nebo proxy serveru, že by měl ukládat (Vary) odpovědi na základě hodnoty Accept-Encoding záhlaví požadavku. Výsledkem vrácení obsahu s Vary: Accept-Encoding hlavičkou je, že komprimované i nekomprimované odpovědi jsou ukládány do mezipaměti samostatně.

Prozkoumejte funkce middleware pro kompresi odpovědí s ukázkovou aplikací. Ukázka znázorňuje:

  • Komprese odpovědí aplikace pomocí gzip a vlastních zprostředkovatelů komprese.
  • Postup přidání typu MIME do výchozího seznamu typů MIME pro kompresi.

Balíček

Chcete-li zahrnout middleware do projektu, přidejte odkaz na Microsoft.AspNetCore.app Metapackage, který obsahuje balíček Microsoft. AspNetCore. ResponseCompression .

Konfigurace

Následující kód ukazuje, jak povolit middleware pro kompresi odpovědí pro výchozí typy MIME a zprostředkovatele komprese GZip:

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

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

Poznámky:

  • app.UseResponseCompression musí být volána před jakýmkoli middlewarem, který komprimuje odpovědi. Další informace naleznete v tématu ASP.NET Core Jiné.
  • Pomocí nástroje, jako je Fiddler, vývojář prohlížeče Firefoxnebo autor , nastavte Accept-Encoding hlavičku požadavku a prostudujte hlavičky, velikost a text odpovědi.

Odešlete žádost do ukázkové aplikace bez Accept-Encoding hlavičky a sledujte, že odpověď je nekomprimovaná. Content-Encoding Vary V odpovědi nejsou k dispozici hlavičky a.

Okno Fiddler znázorňující výsledek požadavku bez hlavičky Accept-Encoding. Odpověď není komprimovaná.

Odešlete žádost do ukázkové aplikace s Accept-Encoding: gzip hlavičkou a sledujte, že je odpověď komprimovaná. V Content-Encoding Vary odpovědi jsou k dispozici hlavičky a.

Fiddler okno znázorňující výsledek požadavku s hlavičkou Accept-Encoding a hodnotou gzip. K odpovědi se přidají záhlaví Vary a kódování obsahu. Odpověď je komprimovaná.

Zprostředkovatelé

Zprostředkovatel komprese GZip

Použijte GzipCompressionProvider pro komprimaci odpovědí ve formátu souboru gzip.

Pokud nejsou explicitně přidány žádní zprostředkovatelé komprese do CompressionProviderCollection :

  • Zprostředkovatel komprese GZip je ve výchozím nastavení přidán k poli zprostředkovatelů komprese.
  • Komprese je výchozím nastavením pro nástroj gzip, pokud klient podporuje kompresi gzip.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();
}

Zprostředkovatel komprese GZip se musí přidat, když se explicitně přidají poskytovatelé komprese:

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

Nastavte úroveň komprese pomocí GzipCompressionProviderOptions . Zprostředkovatel komprese GZip je výchozím nastavením nejrychlejší kompresní úrovně (CompressionLevel. nejrychlejší), což nemusí způsobovat nejúčinnější kompresi. Pokud je žádoucí co nejúčinnější komprese, nakonfigurujte middleware pro optimální kompresi.

Úroveň komprese Description
CompressionLevel. nejrychlejší Komprese by měla být dokončena co nejrychleji, a to i v případě, že výsledný výstup není optimálně komprimován.
CompressionLevel. uncompression Není nutné provádět kompresi.
CompressionLevel. optimální Odpovědi by se měly optimálně komprimovat, a to i v případě, že je komprese delší dobu trvat.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();

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

Vlastní poskytovatelé

Vytvořte vlastní implementace komprese pomocí ICompressionProvider . EncodingNamePředstavuje kódování obsahu, které ICompressionProvider vytváří. Middleware používá tyto informace k výběru poskytovatele založeného na seznamu zadaném v Accept-Encoding hlavičce žádosti.

Pomocí ukázkové aplikace klient odesílá požadavek s Accept-Encoding: mycustomcompression hlavičkou. Middleware používá vlastní kompresní implementaci a vrací odpověď s Content-Encoding: mycustomcompression hlavičkou. Aby mohla vlastní implementace komprese fungovat, musí být klient schopný dekomprimovat vlastní kódování.

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

Odešlete žádost do ukázkové aplikace s Accept-Encoding: mycustomcompression hlavičkou a sledujte hlavičky odpovědi. V Vary Content-Encoding odpovědi jsou k dispozici hlavičky a. Text odpovědi (nezobrazený) není ukázkou komprimován. Ve třídě ukázky neexistuje žádná implementace komprese CustomCompressionProvider . Nicméně Ukázka ukazuje, kde byste takový kompresní algoritmus implementovali.

Fiddler okno znázorňující výsledek požadavku s hlavičkou Accept-Encoding a hodnotou mycustomcompression. K odpovědi se přidají záhlaví Vary a kódování obsahu.

typy MIME

Middleware určuje výchozí sadu typů MIME pro kompresi:

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

Nahraďte nebo připojovat typy MIME pomocí možností middlewaru pro kompresi odpovědí. Všimněte si, že zástupné typy MIME se text/* nepodporují. ukázková aplikace přidá typ MIME pro image/svg+xml a zkomprimuje a zachová ASP.NET Core obrázek banneru (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" });
    });
}

Komprese pomocí zabezpečeného protokolu

Komprimované odpovědi přes zabezpečená připojení se dají řídit pomocí EnableForHttps Možnosti, která je ve výchozím nastavení zakázaná. Použití komprese s dynamicky generovanými stránkami může vést k problémům se zabezpečením, jako jsou trestné činy a útoky za porušení .

Přidávání záhlaví Vary

Při komprimaci odpovědí na základě Accept-Encoding záhlaví může být potenciálně více komprimovaných verzí odpovědi a nekomprimovaná verze. Aby bylo možné zadat do mezipamětí klienta a proxy serveru, že existuje více verzí a měl by být uložen, Vary Hlavička je přidána s Accept-Encoding hodnotou. v ASP.NET Core 2,0 nebo novější middleware přidá Vary hlavičku automaticky, když je odpověď komprimovaná.

Problém middlewaru, když za Nginx reverzní proxy

Když požadavek vyNginx proxy serverem, Accept-Encoding Hlavička se odebere. Odebrání Accept-Encoding hlavičky brání middlewaru v komprimaci odpovědi. Další informace naleznete v tématu Nginx: Compression a decompression. Tento problém je sledován pomocí předávací komprese pro Nginx (ASPNET/BasicMiddleware #123).

Práce s dynamickou kompresí služby IIS

Pokud máte aktivní dynamický kompresní modul služby IIS nakonfigurovaný na úrovni serveru, který chcete pro aplikaci zakázat, zakažte modul s přidáním do souboru web.config . Další informace najdete v tématu zakázání modulů IIS.

Řešení potíží

Použijte nástroj, jakoje Fiddler, vývojář prohlížeče Firefox nebo autor, který vám umožní nastavit Accept-Encoding hlavičku požadavku a prozkoumat hlavičky, velikost a text odpovědi. Ve výchozím nastavení middleware pro komprimaci odezvy komprimuje odezvy, které splňují následující podmínky:

  • Accept-EncodingHlavička je přítomna s hodnotou gzip , * nebo vlastní kódování, které se shoduje s vlastním poskytovatelem komprese, který jste navázali. Hodnota nesmí být identity nebo mít hodnotu kvality (qvalue, q ) nastavenou na 0 (nula).
  • Typ MIME ( Content-Type ) musí být nastaven a musí odpovídat typu MIME nakonfigurovanému v ResponseCompressionOptions .
  • Požadavek nesmí obsahovat Content-Range hlavičku.
  • Požadavek musí používat protokol HTTP (nezabezpečený protokol), pokud není v možnostech middleware pro kompresi odpovědí nakonfigurovaný protokol HTTPS (Secure Protocol). Při povolování komprese zabezpečeného obsahu si všimněte výše popsaného nebezpečí.

Další zdroje informací