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:
- Nelze použít následující serverové kompresní technologie:
- Hostování přímo na:
- HTTP.sys server (dříve WebListener)
- Kestrel Server
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.UseResponseCompressionmusí 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.

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 .

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.

typy MIME
Middleware určuje výchozí sadu typů MIME pro kompresi:
application/javascriptapplication/jsonapplication/xmltext/csstext/htmltext/jsontext/plaintext/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 hodnotoubr,gzip,*nebo vlastní kódování, které odpovídá vlastnímu poskytovateli komprese, který jste navázali. Hodnota nesmí býtidentitynebo 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-Rangehlavič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:
- Nelze použít následující technologie komprese založené na serveru:
- Hostování přímo na:
- ServerHTTP.sys (dříve označovaný jako weblisten)
- Kestrel WebServer
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.UseResponseCompressionmusí 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.

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 .

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.

typy MIME
Middleware určuje výchozí sadu typů MIME pro kompresi:
application/javascriptapplication/jsonapplication/xmltext/csstext/htmltext/jsontext/plaintext/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 hodnotoubr,gzip,*nebo vlastní kódování, které odpovídá vlastnímu poskytovateli komprese, který jste navázali. Hodnota nesmí býtidentitynebo 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-Rangehlavič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:
- Nelze použít následující technologie komprese založené na serveru:
- Hostování přímo na:
- ServerHTTP.sys (dříve označovaný jako weblisten)
- Kestrel WebServer
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.UseResponseCompressionmusí 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-Encodinghlavič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.

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.

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.

typy MIME
Middleware určuje výchozí sadu typů MIME pro kompresi:
application/javascriptapplication/jsonapplication/xmltext/csstext/htmltext/jsontext/plaintext/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 hodnotougzip,*nebo vlastní kódování, které se shoduje s vlastním poskytovatelem komprese, který jste navázali. Hodnota nesmí býtidentitynebo 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-Rangehlavič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čí.