Internetový provoz lze komprimovat, aby se ušetřilo využití šířky pásma sítě. Zatímco obrázky a webová písma jsou již komprimována, textové soubory jsou na serveru uloženy ve formě čitelné pro člověka. HTTP.sys server a Kestrel v současné době nemají integrovanou podporu komprese. Ve výchozím nastavení jsou komprimovány pouze statické soubory s § gzip. Co když chcete komprimovat více?
Důvody
Existuje několik důvodů, proč byste mohli chtít změnit konfiguraci komprese:
- Podpora formátu komprese Brotli
- Komprimace přes TLS
- Komprese dynamicky generovaného obsahu
Brotli
Dva inženýři společnosti Google navrhli kompresní formát Brotli. Ve srovnání s gzip je Brotli přibližně o 20 % výkonnější při kompresi a přibližně 20krát rychlejší při dekompresi. Používá se ve formátu WOFF2. Brotli používá Huffmanovo kódování a variantu algoritmu LZ77. Brotli podporují všechny hlavní prohlížeče (Firefox od ledna 2016, Chrome od dubna 2016, Opera od června 2016, Edge od dubna 2017 a Safari od října 2017).
Komprimovat v TLS
Komprese v protokolu TLS je ohrožena v důsledku útoku BREACH . Pokud však vaše soubory cookie splňují zásady same-site, je váš web chráněn před útoky CSRF a BREACH
Komprese dynamického obsahu
Na rozdíl od statických souborů nelze dynamický obsah ukládat do mezipaměti, takže každá odpověď musí být komprimována samostatně. Přináší efektivnější využití šířky pásma, ale také vyšší zatížení procesoru.
Implementace
Povolení komprese ve webové aplikaci ASP.NET Core 2 je velmi snadné.
Krok 1 – Použijte kompresi odpovědí
V souboru UseResponseCompression
9 volejte metodu §1:
public class Startup {
public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
app.UseResponseCompression();
}
}
Krok 2 – povolte kompresi gzip
V souboru Startup.cs volejte metodu Configure
:
public class Startup {
public void ConfigureServices(IServiceCollection services) {
services.Configure<GzipCompressionProviderOptions>(options => {
options.Level = CompressionLevel.Fastest;
});
}
}
Krok 3 – vytvořte poskytovatele komprese Brotli
Nejprve musíte nainstalovat balíček NuGet BrotliSharpLib , protože Brotli není v současné době podporován v .NET Core 2.0.0.
Za druhé, přidejte novou třídu, která poskytuje kompresi Brotli.
public class BrotliCompressionProvider : ICompressionProvider {
public string EncodingName => "br";
public bool SupportsFlush => true;
public Stream CreateStream(Stream outputStream) => new BrotliStream(outputStream, CompressionMode.Compress);
}
Krok 4 – zaregistrujte poskytovatele komprese Brotli
V souboru Startup.cs volejte metodu AddResponseCompression
:
public class Startup {
public void ConfigureServices(IServiceCollection services) {
services.AddResponseCompression(options => {
options.Providers.Add<BrotliCompressionProvider>();
});
}
}
Krok 5 – povolte kompresi v TLS připojení
V souboru Startup.cs nastavte vlastnost EnableForHttps
ve volání metody AddResponseCompression
:
public class Startup {
public void ConfigureServices(IServiceCollection services) {
services.AddResponseCompression(options => {
options.Providers.Add<BrotliCompressionProvider>();
options.EnableForHttps = true;
});
}
}
Krok 6 – Deklarujte další typy MIME pro kompresi
Ve výchozím nastavení jsou ASP.NET Core 2 komprimovány pouze následující typy MIME:
- text/prostý
- text/css
- aplikace/javascript
- text/html
- aplikace/xml
- text/xml
- aplikace/json
- text/json
Vaše webová aplikace může obsluhovat více typů MIME, které lze komprimovat, například:
- application/xhtml+xml
- aplikace/atom+xml
- obrázek/svg+xml
V souboru Startup.cs nastavte vlastnost MimeTypes
ve volání metody AddResponseCompression
:
public class Startup {
public void ConfigureServices(IServiceCollection services) {
options.Providers.Add<BrotliCompressionProvider>();
options.EnableForHttps = true;
options.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(new[] {
"application/xhtml+xml",
"application/atom+xml",
"image/svg+xml",
});
}
}
Krok 7 – Otestujte to
F12 Dev Tools v současné době nezobrazuje hlavičku odpovědi content-encoding
. Jedná se o známou chybu, jejíž oprava trvala více než rok. Je nutné spustit alternativní prohlížeč a otestovat, zda váš server odpoví hlavičkou HTTP content-encoding: br
.
Další myšlenky
- Edge, Chrome a Firefox deklarují podporu Brotli pouze u připojení TLS. Má to svůj praktický důvod. Když se týmy Chrome a Firefox pokusily implementovat kompresi bzip2 a SDCH, zjistily, že některé proxy servery kazí obsah HTTP.
- Brotli Compressed Data Format je standardizován IETF jako RFC 7932.
- Microsoft již pracuje na podpoře Brotli v ASP.NET Core, ale balíček ještě není připraven k výrobě.
- ASP.NET Core 2 v současné době nepodporuje zakázání dynamické komprese, když procesor dosáhne vysokého zatížení, na rozdíl od služby IIS.
- Komprese obsahu je mnohem efektivnější způsob, jak zmenšit velikost odpovědi, než minifikace souborů CSS nebo JavaScript.