Dajbych.net


Jak povolit kompresi odpovědí v ASP.NET Core 2 pomocí kódování gzip a Brotli

, 3 minuty čtení

net2015 logo

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:

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 UseResponseCompression9 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:

Vaše webová aplikace může obsluhovat více typů MIME, které lze komprimovat, například:

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