Megosztás a következőn keresztül:


Választömörítés a ASP.NET Core-ban

A hálózati sávszélesség korlátozott erőforrás. A válasz méretének csökkentése általában növeli az alkalmazások válaszkészségét, gyakran drámai módon. A hasznos adatok méretének csökkentésének egyik módja az alkalmazás válaszainak tömörítése.

Tömörítés HTTPS-vel

A biztonságos kapcsolatokon keresztüli tömörített válaszok szabályozhatók a EnableForHttps beállítással, amely alapértelmezés szerint le van tiltva a biztonsági kockázat miatt. A dinamikusan generált oldalakkal végzett tömörítés kitevheti az alkalmazást CRIME és BREACH támadásoknak. CRIME és BREACH támadások enyhíthetők ASP.NET Core-ban antiforgery tokenekkel. További információért lásd: Az ASP.NET Core alkalmazásban történő helyek közötti kéréshamisítás (XSRF/CSRF) elleni támadások megakadályozása. A támadások enyhítéséről BREACH további információt a következő címen talál: http://www.breachattack.com/

Az IIS, az IIS Express és az EnableForHttps akkor is alkalmazhat gzipet az IIS-webkiszolgálón, ha le van tiltva az alkalmazásban. A válaszfejlécek áttekintésekor jegyezze fel a kiszolgáló értékét. A válaszfejléc váratlan content-encoding értéke lehet a webkiszolgáló eredménye, és nem a ASP.NET Core-alkalmazás konfigurációja.

Mikor érdemes használni a Választömörítés köztes szoftvert?

Kiszolgálóalapú választömörítési technológiákat használhat az IIS, az Apache vagy az Nginx rendszerben. A választömörítési köztes szoftver teljesítménye valószínűleg nem egyezik meg a kiszolgálómodulok teljesítményével. HTTP.sys kiszolgáló és Kestrel kiszolgáló jelenleg nem nyújt beépített tömörítési támogatást.

Használja a válasz tömörítést biztosító köztes szoftvert, amikor az alkalmazás:

Választömörítés

A nem natívan tömörített válaszok általában kihasználhatják a választömörítés előnyeit. Natív módon nem tömörített válaszok általában: CSS, JavaScript, HTML, XML, JSON. Ne tömörítse natívan tömörített objektumokat, például PNG-fájlokat. A natívan tömörített válasz további tömörítésekor a tömörítés feldolgozásához szükséges idő valószínűleg háttérbe szorítja a méret és az átviteli idő kis mértékű csökkentését. A fájl tartalmától és a tömörítés hatékonyságától függően ne tömörítse a 150–1000 bájtnál kisebb fájlokat. A kis méretű fájlok tömörítésének többletterhelése a tömörítetlen fájlnál nagyobb tömörített fájlt eredményezhet.

Ha egy ügyfél feldolgozhatja a tömörített tartalmat, az ügyfélnek tájékoztatnia kell a kiszolgálót a képességeiről a Accept-Encoding fejléc kéréssel való elküldésével. Ha egy kiszolgáló tömörített tartalmat küld, a fejlécnek tartalmaznia kell a Content-Encoding tömörített válasz kódolásának módját. A választömörítési köztes szoftver által támogatott tartalomkódolási megjelölések az alábbi táblázatban láthatók.

Accept-Encoding fejlécértékek Köztes szoftver támogatott Description
br Igen (alapértelmezett) Brotli tömörített adatformátum
deflate No DEFLATE tömörített adatformátum
exi No W3C Efficient XML Interchange
gzip Yes Gzip fájlformátum
identity Yes "Nincs kódolás" azonosító: A válasz nem kódolható.
pack200-gzip No Hálózatátviteli formátum Java-archívumokhoz
* Yes Bármilyen elérhető tartalomkódolás, amely nincs explicit módon kérve

További információkért lásd az IANA hivatalos tartalomkódolási listáját.

A választömörítés közbenső szoftvere további tömörítési szolgáltatók hozzáadását teszi lehetővé az egyéni Accept-Encoding fejlécértékekhez. További információ: Egyéni szolgáltatók ebben a cikkben.

A válasz tömörítésére szolgáló köztes szoftver képes reagálni a minőségi értéket (qvalue) tartalmazó súlyozásra, amikor az ügyfél elküldi a tömörítési sémák rangsorolására. További információ: RFC 9110: Accept-Encoding.

A tömörítési algoritmusok közötti különbség a tömörítés sebessége és a tömörítés hatékonysága között van. A hatékonyság ebben a kontextusban a kimenet tömörítés utáni méretére utal. A legkisebb méret az optimális tömörítéssel érhető el.

A tömörített tartalom igénylésében, küldésében, gyorsítótárazásában és fogadásában részt vevő fejléceket az alábbi táblázat ismerteti.

Header Role
Accept-Encoding Elküldve az ügyféltől a kiszolgálónak, hogy jelezze az ügyfél számára elfogadható tartalomkódolási sémákat.
Content-Encoding A szerverről az ügyfélhez küldött üzenet jelzi a hasznos teher tartalmának kódolását.
Content-Length Tömörítés esetén a Content-Length fejléc el lesz távolítva, mivel a törzs tartalma megváltozik a válasz tömörítésekor.
Content-MD5 Tömörítés esetén a rendszer eltávolítja a Content-MD5 fejlécet, mivel a törzs tartalma megváltozott, és a kivonat már nem érvényes.
Content-Type A tartalom MIME-típusát adja meg. Minden válasznak meg kell határoznia annak Content-Type. A választömörítés köztes szoftvere ellenőrzi ezt az értéket annak megállapításához, hogy a válasz tömörítése szükséges-e. A választömörítési köztes szoftver meghatározza az alapértelmezett MIME-típusokat , amelyeket kódolhat, és lecserélhetik vagy hozzáadhatják őket.
Vary Amikor a kiszolgáló Accept-Encoding értékű fejlécet küld az ügyfélnek vagy a proxynak, a Vary fejléc azt jelezheti, hogy a kérés Accept-Encoding fejlécének értéke alapján variálva kell gyorsítótárazni a válaszokat. A Vary: Accept-Encoding fejlécet használó tartalom visszaadásának eredménye, hogy a tömörített és a tömörítetlen válaszok külön-külön kerülnek gyorsítótárazásra.

A választömörítési köztes szoftver funkcióinak megismerése a mintaalkalmazással. A minta a következőket szemlélteti:

  • Az alkalmazásválaszok tömörítése a Gzip és az egyéni tömörítési szolgáltatók használatával.
  • MIME-típus hozzáadása a tömörítéshez használt MIME-típusok alapértelmezett listájához.
  • Egyéni választömörítési szolgáltató hozzáadása.

Configuration

Az alábbi kód bemutatja, hogyan engedélyezheti a Választömörítés közbenső szoftverét az alapértelmezett MIME-típusok és tömörítési szolgáltatók (Brotli és Gzip) esetében:

var builder = WebApplication.CreateBuilder(args);

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

var app = builder.Build();

app.UseResponseCompression();

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

app.Run();

Notes:

  • EnableForHttps beállítása true biztonsági kockázatot jelent. További információt ebben a cikkben a HTTPS-vel történő tömörítéssel kapcsolatban talál.
  • app.UseResponseCompression-t a válaszokat tömörítő köztes szoftver előtt kell meghívni. További információ: ASP.NET Core Middleware.
  • A kérés fejlécének beállításához és a válasz fejlécének, méretének és törzsének vizsgálatához használjon olyan eszközt, mint a Accept-Encoding.

Küldjön egy kérést a mintaalkalmazásnak a Accept-Encoding fejléc nélkül, és figyelje meg, hogy a válasz nincs tömörítve. Az Content-Encoding fejléc nincs a válaszfejlécek gyűjteményben.

Például a Firefox Developerben:

  • Válassza a hálózat fület.
  • Kattintson a jobb gombbal a kérésre a Hálózati kérelem listában, és válassza a Szerkesztés és az újraküldés lehetőséget
  • Accept-Encoding: módosítása gzip, deflate, br-ról none-ra.
  • Válassza a Küldés lehetőséget.

Küldjön egy kérést a mintaalkalmazásnak egy böngészővel a fejlesztői eszközök használatával, és figyelje meg, hogy a válasz tömörítve van. A válasz tartalmazza a Content-Encoding és Vary fejléceket.

Providers

Brotli- és Gzip-tömörítési szolgáltatók

Használja a BrotliCompressionProvider a válaszok tömörítésére a Brotli tömörített adatformátumával.

Ha a rendszer nem ad hozzá kifejezetten tömörítési szolgáltatókat a CompressionProviderCollectionkövetkezőhöz:

  • A Brotli tömörítési szolgáltató és a Gzip tömörítési szolgáltató alapértelmezés szerint hozzáadódik a tömörítési szolgáltatók tömbjéhez.
  • A tömörítés alapértelmezés szerint Brotli-tömörítés, ha az ügyfél támogatja a Brotli tömörített adatformátumot. Ha az ügyfél nem támogatja a Brotli-t, a tömörítés alapértelmezés szerint gzip lesz, ha az ügyfél támogatja a Gzip-tömörítést.

Note

A .NET referenciaforrásra mutató dokumentációs hivatkozások általában betöltik az adattár alapértelmezett ágát, amely a .NET következő kiadásának aktuális fejlesztését jelöli. Egy adott kiadás címkéjének kiválasztásához használja az Ágak vagy címkék közötti váltás legördülő listát. További információ: A ASP.NET Core-forráskód (dotnet/AspNetCore.Docs #26205) verziócímkéjének kiválasztása.

Tömörítési szolgáltató hozzáadásakor a rendszer nem ad hozzá más szolgáltatókat. Ha például a Gzip-tömörítési szolgáltató az egyetlen kifejezetten hozzáadott szolgáltató, akkor más tömörítési szolgáltatók nem lesznek hozzáadva.

A következő kód:

  • Engedélyezi a HTTPS-kérelmek választömörítését.
  • Hozzáadja a Brotli és gzip választömörítési szolgáltatókat.
using System.IO.Compression;
using Microsoft.AspNetCore.ResponseCompression;

var builder = WebApplication.CreateBuilder(args);

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

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

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

var app = builder.Build();

app.UseResponseCompression();

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

app.Run();

A tömörítési szint beállítása a következővel BrotliCompressionProviderOptions : és GzipCompressionProviderOptions. A Brotli és a Gzip tömörítési szolgáltatók alapértelmezés szerint a leggyorsabb tömörítési szintre( CompressionLevel.Leggyorsabb), amely nem a leghatékonyabb tömörítést hozza létre. Ha a leghatékonyabb tömörítésre van szükség, konfigurálja a választömörítés közbenső szoftverét az optimális tömörítés érdekében.

A tömörítési művelet sebességét vagy tömörítési méretét jelző értékekről a CompressionLevel Enum című témakörben olvashat.

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

var builder = WebApplication.CreateBuilder(args);

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

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

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

var app = builder.Build();

app.UseResponseCompression();

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

app.Run();

Egyéni szolgáltatók

Egyéni tömörítési implementációk létrehozása a ICompressionProvider segítségével. Az EncodingName ez ICompressionProvider által előállított tartalomkódolást jelöli. A választömörítési köztes szoftver ezen információk alapján választja ki a szolgáltatót a Accept-Encoding kérés fejlécében megadott lista alapján.

A fejlécet tartalmazó Accept-Encoding: mycustomcompression mintaalkalmazáshoz érkező kérések fejléces Content-Encoding: mycustomcompression választ adnak vissza. Az ügyfélnek képesnek kell lennie az egyéni kódolás kibontására ahhoz, hogy az egyéni tömörítési implementáció működjön.

using Microsoft.AspNetCore.ResponseCompression;

var builder = WebApplication.CreateBuilder(args);

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

var app = builder.Build();

app.UseResponseCompression();

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

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

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

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

Az előző kóddal a válasz törzsét nem tömöríti a minta. A minta azonban bemutatja, hol kell implementálni egy egyéni tömörítési algoritmust.

MIME-típusok

A választömörítés közbenső szoftvere a mime-típusok alapértelmezett készletét adja meg a tömörítéshez. A támogatott MIME-típusok teljes listáját a forráskódban találja.

Note

A .NET referenciaforrásra mutató dokumentációs hivatkozások általában betöltik az adattár alapértelmezett ágát, amely a .NET következő kiadásának aktuális fejlesztését jelöli. Egy adott kiadás címkéjének kiválasztásához használja az Ágak vagy címkék közötti váltás legördülő listát. További információ: A ASP.NET Core-forráskód (dotnet/AspNetCore.Docs #26205) verziócímkéjének kiválasztása.

Cserélje le vagy fűzze hozzá a MIME-típusokat a ResponseCompressionOptions.MimeTypesgombra. Vegye figyelembe, hogy a helyettesítő karakterek MIME-típusai, például text/* nem támogatottak. A mintaalkalmazás hozzáad egy MIME-típust a image/svg+xml számára, tömöríti és kiszolgálja az ASP.NET Core bannert, amely a banner.svg.

using Microsoft.AspNetCore.ResponseCompression;
using ResponseCompressionSample;

var builder = WebApplication.CreateBuilder(args);

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

var app = builder.Build();

app.UseResponseCompression();

A Vary fejléc hozzáadása

Ha a kérés fejléce alapján tömöríti a Accept-Encodingválaszokat, a válasz tömörítetlen és több tömörített verziója is lehet. Annak érdekében, hogy az ügyfél- és proxygyorsítótárakat arra utasítsa, hogy több verzió is létezik és tárolandó, a Vary fejléc egy Accept-Encoding értékkel lesz hozzáadva. A válaszközvetítési szoftver automatikusan hozzáadja a Vary fejlécet a válasz tömörítésekor.

Note

A .NET referenciaforrásra mutató dokumentációs hivatkozások általában betöltik az adattár alapértelmezett ágát, amely a .NET következő kiadásának aktuális fejlesztését jelöli. Egy adott kiadás címkéjének kiválasztásához használja az Ágak vagy címkék közötti váltás legördülő listát. További információ: A ASP.NET Core-forráskód (dotnet/AspNetCore.Docs #26205) verziócímkéjének kiválasztása.

Köztes szoftver probléma, ha Nginx fordított proxy mögött

Ha az Nginx proxy-z egy kérést, a Accept-Encoding fejléc eltávolításra kerül. A fejléc eltávolítása megakadályozza, hogy a válasz tömörítésére szolgáló middleware tömörítse a választ. További információ: NGINX: Tömörítés és kicsomagolás. Ezt a problémát az Nginx átmenő tömörítésének megoldása (dotnet/aspnetcore#5989) követi nyomon.

Az IIS dinamikus tömörítésének letiltása

A kiszolgáló szintjén konfigurált IIS dinamikus tömörítési modul letiltásához tekintse meg az IIS-modulok letiltását ismertető témakört.

Választömörítés hibaelhárítása

Használjon olyan eszközt, mint a Firefox Browser Developer, amely lehetővé teszi a kérelem fejlécének Accept-Encoding beállítását és a válaszfejlécek, a méret és a törzs tanulmányozása. Alapértelmezés szerint a Választömörítés köztes szoftver tömöríti az alábbi feltételeknek megfelelő válaszokat:

  • A Accept-Encoding fejléc értéke lehet br, gzip, * vagy egy egyéni kódolás, amely megfelel egy egyéni tömörítési szolgáltatónak. Az érték nem lehet egyenlő identity-val, és nem lehet 0 (nulla) minőségi értéket (qvalue-t, q) beállítani.
  • A MIME típust (Content-Type) be kell állítani, és meg kell egyeznie a MIME típussal, amely a ResponseCompressionOptions-on van beállítva.
  • A kérelem nem tartalmazhat fejlécet Content-Range .
  • A kérésnek nem biztonságos protokollt (http) kell használnia, kivéve, ha a biztonságos protokoll (https) konfigurálva van a Választömörítés köztes szoftver beállításai között. Figyelje meg a fent leírt veszélyeket a biztonságos tartalomtömörítés engedélyezésekor.

Üzembe helyezett Azure-minta

Az Azure-ban üzembe helyezett mintaalkalmazás a következő Program.cs fájllal rendelkezik:

using Microsoft.AspNetCore.ResponseCompression;
using ResponseCompressionSample;

var builder = WebApplication.CreateBuilder(args);

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

var app = builder.Build();

app.UseResponseCompression();

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

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

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

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

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

app.Run();

További erőforrások

Note

A .NET referenciaforrásra mutató dokumentációs hivatkozások általában betöltik az adattár alapértelmezett ágát, amely a .NET következő kiadásának aktuális fejlesztését jelöli. Egy adott kiadás címkéjének kiválasztásához használja az Ágak vagy címkék közötti váltás legördülő listát. További információ: A ASP.NET Core-forráskód (dotnet/AspNetCore.Docs #26205) verziócímkéjének kiválasztása.

A hálózati sávszélesség korlátozott erőforrás. A válasz méretének csökkentése általában növeli az alkalmazások válaszkészségét, gyakran drámai módon. A hasznos adatok méretének csökkentésének egyik módja az alkalmazás válaszainak tömörítése.

Mintakód megtekintése vagy letöltése (hogyan töltsd le)

Mikor érdemes használni a Választömörítés köztes szoftvert?

Kiszolgálóalapú választömörítési technológiákat használhat az IIS, az Apache vagy az Nginx rendszerben. A köztes szoftver teljesítménye valószínűleg nem egyezik meg a kiszolgálómodulok teljesítményével. HTTP.sys kiszolgáló és Kestrel kiszolgáló jelenleg nem nyújt beépített tömörítési támogatást.

Választömörítési köztes szoftver használata a következő esetekben:

Választömörítés

A nem natívan tömörített válaszok általában kihasználhatják a választömörítés előnyeit. A natívan nem tömörített válaszok általában a következők: CSS, JavaScript, HTML, XML és JSON. Nem szabad natívan tömörített objektumokat, például PNG-fájlokat tömöríteni. Ha natívan tömörített választ kísérel meg tovább tömöríteni, a tömörítés feldolgozásához igénybe vett idő valószínűleg beárnyékolja a méret és az átviteli idő kis mértékű csökkentését. Ne tömörítse a 150–1000 bájtnál kisebb fájlokat (a fájl tartalmától és a tömörítés hatékonyságától függően). A kis méretű fájlok tömörítésének többletterhelése a tömörítetlen fájlnál nagyobb tömörített fájlt eredményezhet.

Ha egy ügyfél feldolgozhatja a tömörített tartalmat, az ügyfélnek tájékoztatnia kell a kiszolgálót a képességeiről a Accept-Encoding fejléc kéréssel való elküldésével. Ha egy kiszolgáló tömörített tartalmat küld, a fejlécnek tartalmaznia kell a Content-Encoding tömörített válasz kódolásának módját. A köztes szoftver által támogatott tartalomkódolási megjelölések az alábbi táblázatban láthatók.

Accept-Encoding fejlécértékek Köztes szoftver támogatott Description
br Igen (alapértelmezett) Brotli tömörített adatformátum
deflate No DEFLATE tömörített adatformátum
exi No W3C Efficient XML Interchange
gzip Yes Gzip fájlformátum
identity Yes "Nincs kódolás" azonosító: A válasz nem kódolható.
pack200-gzip No Hálózatátviteli formátum Java-archívumokhoz
* Yes Bármilyen elérhető tartalomkódolás, amely nincs explicit módon kérve

További információkért lásd az IANA hivatalos tartalomkódolási listáját.

A köztes szoftver lehetővé teszi további tömörítési szolgáltatók hozzáadását az egyéni Accept-Encoding fejlécértékekhez. További információkért lásd alább az egyéni szolgáltatókat .

A köztes szoftver képes reagálni a minőségi érték (qvalue) súlyozására q, amikor az ügyfél elküldi, hogy rangsorolja a tömörítési sémákat. További információ: RFC 9110: Accept-Encoding.

A tömörítési algoritmusok közötti különbség a tömörítés sebessége és a tömörítés hatékonysága között van. A hatékonyság ebben a kontextusban a kimenet tömörítés utáni méretére utal. A legkisebb méret a legoptimálisabb tömörítéssel érhető el.

A tömörített tartalom igénylésében, küldésében, gyorsítótárazásában és fogadásában részt vevő fejléceket az alábbi táblázat ismerteti.

Header Role
Accept-Encoding Elküldve az ügyféltől a kiszolgálónak, hogy jelezze az ügyfél számára elfogadható tartalomkódolási sémákat.
Content-Encoding A szerverről az ügyfélhez küldött üzenet jelzi a hasznos teher tartalmának kódolását.
Content-Length Tömörítés esetén a Content-Length fejléc el lesz távolítva, mivel a törzs tartalma megváltozik a válasz tömörítésekor.
Content-MD5 Tömörítés esetén a rendszer eltávolítja a Content-MD5 fejlécet, mivel a törzs tartalma megváltozott, és a kivonat már nem érvényes.
Content-Type A tartalom MIME-típusát adja meg. Minden válasznak meg kell határoznia annak Content-Type. A köztes szoftver ellenőrzi ezt az értéket annak megállapításához, hogy a válasz tömörítése szükséges-e. A köztes szoftver olyan alapértelmezett MIME-típusokat határoz meg, amelyeket kódolhat, de mime-típusokat cserélhet vagy adhat hozzá.
Vary Amikor a kiszolgáló Accept-Encoding értékű fejlécet küld az ügyfélnek vagy a proxynak, a Vary fejléc azt jelezheti, hogy a kérés Accept-Encoding fejlécének értéke alapján variálva kell gyorsítótárazni a válaszokat. A Vary: Accept-Encoding fejlécet használó tartalom visszaadásának eredménye, hogy a tömörített és a tömörítetlen válaszok külön-külön kerülnek gyorsítótárazásra.

A választömörítési köztes szoftver funkcióinak megismerése a mintaalkalmazással. A minta a következőket szemlélteti:

  • Az alkalmazásválaszok tömörítése a Gzip és az egyéni tömörítési szolgáltatók használatával.
  • MIME-típus hozzáadása a tömörítéshez használt MIME-típusok alapértelmezett listájához.

Configuration

Az alábbi kód bemutatja, hogyan engedélyezheti a Választömörítés közbenső szoftverét az alapértelmezett MIME-típusok és tömörítési szolgáltatók (Brotli és Gzip) esetében:

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

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

Notes:

  • A `app.UseResponseCompression`-t kell meghívni bármely válaszokat tömörítő middleware előtt. További információ: ASP.NET Core Middleware.
  • A kérés fejlécének beállításához és a válaszfejlécek, a méret és a törzs tanulmányozásához használjon olyan eszközt, mint a Fiddler, a Accept-Encoding.

Küldjön egy kérést a mintaalkalmazásnak a Accept-Encoding fejléc nélkül, és figyelje meg, hogy a válasz nincs tömörítve. A Content-Encoding és Vary fejlécek nincsenek jelen a válaszban.

A Fiddler ablak egy kérés eredményét jeleníti meg a Accept-Encoding fejléc nélkül. A válasz nincs tömörítve.

Küldjön egy kérelmet a mintaalkalmazásnak a Accept-Encoding: br fejléccel (Brotli-tömörítés), és figyelje meg, hogy a válasz tömörítve van. A válasz tartalmazza a Content-Encoding és Vary fejléceket.

A Fiddler ablak egy kérés eredményét jeleníti meg a Accept-Encoding fejléccel és egy br értékkel. A válaszhoz hozzáadja a Vary és a Content-Encoding fejléceket. A válasz tömörítve van.

Providers

Brotli tömörítési szolgáltató

Használja a BrotliCompressionProvider a válaszok tömörítésére a Brotli tömörített adatformátumával.

Ha nincsenek kifejezetten tömörítési szolgáltatók hozzáadva a CompressionProviderCollection-hoz:

  • A Brotli tömörítési szolgáltató alapértelmezés szerint hozzáadódik a tömörítési szolgáltatók tömbjéhez a Gzip tömörítési szolgáltatóval együtt.
  • A tömörítés alapértelmezés szerint Brotli-tömörítés, ha az ügyfél támogatja a Brotli tömörített adatformátumot. Ha az ügyfél nem támogatja a Brotli-t, a tömörítés alapértelmezés szerint gzip lesz, ha az ügyfél támogatja a Gzip-tömörítést.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();
}

A Brotli-tömörítési szolgáltatót hozzá kell adni, ha bármilyen tömörítési szolgáltatót kifejezetten hozzáadnak.

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

A tömörítési szint beállítása a következővel BrotliCompressionProviderOptions: . A Brotli tömörítési szolgáltató alapértelmezés szerint a leggyorsabb tömörítési szintre (CompressionLevel.Leggyorsabb), amely nem feltétlenül hozza létre a leghatékonyabb tömörítést. Ha a leghatékonyabb tömörítésre van szükség, konfigurálja a köztes szoftvert az optimális tömörítéshez.

Tömörítési szint Description
CompressionLevel.Leggyorsabb A tömörítésnek a lehető leggyorsabban kell befejeződnie, még akkor is, ha az eredményül kapott kimenet nincs optimálisan tömörítve.
CompressionLevel.NoCompression Nem szabad tömörítést végezni.
CompressionLevel.Optimal A válaszokat optimálisan tömöríteni kell, még akkor is, ha a tömörítés több időt vesz igénybe.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();

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

Gzip tömörítési szolgáltató

GzipCompressionProvider A válaszok Gzip-fájlformátummal való tömörítéséhez használja a parancsot.

Ha nincsenek kifejezetten tömörítési szolgáltatók hozzáadva a CompressionProviderCollection-hoz:

  • A rendszer alapértelmezés szerint hozzáadja a Gzip tömörítési szolgáltatót a tömörítési szolgáltatók tömbjéhez a Brotli tömörítési szolgáltatóval együtt.
  • A tömörítés alapértelmezés szerint Brotli-tömörítés, ha az ügyfél támogatja a Brotli tömörített adatformátumot. Ha az ügyfél nem támogatja a Brotli-t, a tömörítés alapértelmezés szerint gzip lesz, ha az ügyfél támogatja a Gzip-tömörítést.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();
}

A Gzip-tömörítési szolgáltatót akkor kell hozzáadni, ha bármely tömörítési szolgáltató explicit módon van hozzáadva:

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

A tömörítési szint beállítása a következővel GzipCompressionProviderOptions: . A Gzip tömörítési szolgáltató alapértelmezés szerint a leggyorsabb tömörítési szintre (CompressionLevel.Leggyorsabb), amely nem feltétlenül hozza létre a leghatékonyabb tömörítést. Ha a leghatékonyabb tömörítésre van szükség, konfigurálja a köztes szoftvert az optimális tömörítéshez.

Tömörítési szint Description
CompressionLevel.Leggyorsabb A tömörítésnek a lehető leggyorsabban kell befejeződnie, még akkor is, ha az eredményül kapott kimenet nincs optimálisan tömörítve.
CompressionLevel.NoCompression Nem szabad tömörítést végezni.
CompressionLevel.Optimal A válaszokat optimálisan tömöríteni kell, még akkor is, ha a tömörítés több időt vesz igénybe.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();

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

Egyéni szolgáltatók

Egyéni tömörítési implementációk létrehozása a ICompressionProvider segítségével. Az EncodingName ez ICompressionProvider által előállított tartalomkódolást jelöli. A köztes szoftver ezen információk alapján választja ki a szolgáltatót a kérés fejlécében Accept-Encoding megadott lista alapján.

A mintaalkalmazás használatával az ügyfél elküld egy kérelmet a Accept-Encoding: mycustomcompression fejlécmel együtt. A köztes szoftver az egyéni tömörítési implementációt használja, és egy fejléccel Content-Encoding: mycustomcompression adja vissza a választ. Az ügyfélnek képesnek kell lennie az egyéni kódolás kibontására ahhoz, hogy az egyéni tömörítési implementáció működjö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;
    }
}

Küldjön egy kérelmet a mintaalkalmazásnak a Accept-Encoding: mycustomcompression fejléccel együtt, és figyelje meg a válaszfejléceket. A válasz tartalmazza a Vary és Content-Encoding fejléceket. A válasz törzse (nem jelenik meg) nincs tömörítve a mintával. A minta osztályában CustomCompressionProvider nincs tömörítési implementáció. A minta azonban megmutatja, hol implementálna egy ilyen tömörítési algoritmust.

A Fiddler ablak egy kérés eredményét jeleníti meg a Accept-Encoding fejléc és a mycustomcompression értékével. A válaszhoz hozzáadja a Vary és a Content-Encoding fejléceket.

MIME-típusok

A köztes szoftver a MIME-típusok alapértelmezett készletét adja meg a tömörítéshez:

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

Cserélje le vagy fűzze hozzá a MIME-típusokat a Választömörítés köztes szoftver beállításaival. Vegye figyelembe, hogy a helyettesítő karakterek MIME-típusai, például text/* nem támogatottak. A mintaalkalmazás hozzáad egy MIME-típust a image/svg+xml-hez, és tömöríti és kiszolgálja az ASP.NET Core szalagcímképet (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" });
    });
}

Tömörítés biztonságos protokollal

A biztonságos kapcsolatokon keresztüli tömörített válaszok a beállítással EnableForHttps vezérelhetők, amely alapértelmezés szerint le van tiltva. A dinamikusan létrehozott oldalak tömörítése biztonsági problémákhoz, például támadásokhoz CRIMEBREACH vezethet.

A Vary fejléc hozzáadása

Ha a válaszokat a Accept-Encoding fejléc alapján tömöríti, a válasz több tömörített verziója és egy tömörítetlen verzió is lehet. Annak érdekében, hogy az ügyfél- és proxygyorsítótárakat arra utasítsa, hogy több verzió is létezik és tárolandó, a Vary fejléc egy Accept-Encoding értékkel lesz hozzáadva. A ASP.NET Core 2.0-s vagy újabb verziójában a köztes szoftver automatikusan hozzáadja a Vary fejlécet a válasz tömörítésekor.

Köztes szoftver probléma, ha Nginx fordított proxy mögött

Ha az Nginx proxy-z egy kérést, a Accept-Encoding fejléc eltávolításra kerül. A Accept-Encoding fejléc eltávolítása megakadályozza, hogy a köztes szoftver tömörítse a választ. További információ: NGINX: Tömörítés és kicsomagolás. Ezt a problémát az Nginx átmenő tömörítésének megoldása (dotnet/aspnetcore#5989) követi nyomon.

Az IIS dinamikus tömörítésének használata

Ha egy aktív IIS dinamikus tömörítési modul van konfigurálva a kiszolgáló szintjén, amelyet le szeretne tiltani egy alkalmazáshoz, tiltsa le a modult a web.config fájl hozzáadásával. További információ: Az IIS-modulok letiltása.

Troubleshooting

Használjon olyan eszközt, mint a Fiddler vagy a Firefox Browser Developer, amely lehetővé teszi a kérés fejlécének Accept-Encoding beállítását és a válaszfejlécek, a méret és a törzs vizsgálatát. Alapértelmezés szerint a Választömörítés köztes szoftver tömöríti az alábbi feltételeknek megfelelő válaszokat:

  • A Accept-Encoding fejléc értéke lehet br, gzip, *, vagy egyéni kódolás, amely megfelel az Ön által létrehozott egyéni tömörítési szolgáltatónak. Az érték nem lehet egyenlő identity-val, és nem lehet 0 (nulla) minőségi értéket (qvalue-t, q) beállítani.
  • A MIME típust (Content-Type) be kell állítani, és meg kell egyeznie a MIME típussal, amely a ResponseCompressionOptions-on van beállítva.
  • A kérelem nem tartalmazhat fejlécet Content-Range .
  • A kérésnek nem biztonságos protokollt (http) kell használnia, kivéve, ha a biztonságos protokoll (https) konfigurálva van a Választömörítés köztes szoftver beállításai között. Figyelje meg a fent leírt veszélyeket a biztonságos tartalomtömörítés engedélyezésekor.

További erőforrások