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ások válaszainak tömörítése. Ez a cikk azt ismerteti, hogyan implementálhatja a választömörítést az alkalmazásokhoz választömörítési köztes szoftver használatával a ASP.NET Core.

A tömörítés felfedezése HTTPS használatával

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 mérséklésével BREACH kapcsolatos információkért lásd a következő címen található kockázatcsökkentésekethttp://www.breachattack.com/: .

Még akkor is, ha az alkalmazás letiltja a EnableForHttps tulajdonságot (false), Internet Information Services (IIS), IIS Express és Azure App Service alkalmazhatja Gzip az IIS-webkiszolgálón. A válaszfejlécek áttekintésekor jegyezze fel a kiszolgáló fejlécértékét. Váratlan content-encoding válaszfejléc-érték lehet a webkiszolgáló eredménye, és nem a ASP.NET Core alkalmazáskonfigurációja.

Annak meghatározása, hogy mikor használjon választömörítési middleware-t

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 a kiszolgálómodulok teljesítményével. A 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, ha az alkalmazás a következő:

Választömörítés felfedezése

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 túlárnyékolja 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 az Accept-Encoding fejléc elküldésével a kéréssel együtt. Ha egy kiszolgáló tömörített tartalmat küld, a tartalomkódolás fejlécében szerepelnie kell a tömörített válasz kódolásának módjával kapcsolatos információknak.

Az alábbi táblázat a fejléc tartalomkódolási megjelöléseit Accept-Encoding mutatja be, és jelzi, hogy a választömörítés köztes szoftver támogatja-e a megjelölést.

Megnevezés Middleware Format Részletek
br Igen (alapértelmezett) Brotli tömörített adatformátum RFC 7932
deflate No DEFLATE tömörített adatformátum RFC 1951
exi No Hatékony XML-csere (EXI) W3C-javaslat
gzip Yes Gzip fájlformátum RFC 1952
identity Yes "Nincs kódolás" – a választ nem szabad kódolni Választömörítés hibaelhárítása
pack200-gzip No Hálózati átvitel formátuma Java archívumokhoz JSR 200
* (csillagjel) Yes "Helyettesítő karakter" – minden olyan elérhető tartalomkódolás, amely nincs explicit módon kérve Választömörítés hibaelhárítása
Megnevezés Middleware Format Részletek
br Igen (alapértelmezett) Brotli tömörített adatformátum RFC 7932
deflate No DEFLATE tömörített adatformátum RFC 1951
exi No Hatékony XML-csere (EXI) W3C-javaslat
gzip Yes Gzip fájlformátum RFC 1952
identity Yes "Nincs kódolás" – a választ nem szabad kódolni Választömörítés hibaelhárítása
pack200-gzip No Hálózati átvitel formátuma Java archívumokhoz JSR 200
zstd Igen (alapértelmezett) Zstandard tömörített adatformátum RFC 8878
* (csillagjel) Yes "Helyettesítő karakter" – minden olyan elérhető tartalomkódolás, amely nincs explicit módon kérve Választömörítés hibaelhárítása

További információt a HTTP-paraméterek IANA hivatalos tartalomkódolási listájában talál.

A választömörítés közbenső szoftvere lehetővé teszi más 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ó: Egyéni szolgáltatók a cikk későbbi részében.

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. Lásd az RFC 9110-et: HTTP szemantika (12.5.3. szakasz: Accept-Encoding) további információkért.

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 Részletek
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. Accept-Encoding fejléc
Content-Encoding A szerverről az ügyfélhez küldött üzenet jelzi a hasznos teher tartalmának kódolását. Tartalomkódoló fejléc
Content-Length Tömörítés esetén a rendszer eltávolítja a Content-Length fejlécet, mert a törzs tartalma megváltozik a válasz tömörítésekor. Tartalomhossz fejléce
Content-MD5 Tömörítés esetén a rendszer eltávolítja a Content-MD5 fejlécet, mert a törzs tartalma módosult, és a kivonat már nem érvényes. RFC 1864: A Content-MD5 fejlécmező
Content-Type A tartalom MIME-típusát adja meg. Minden válasznak meg kell adnia az Content-Type értékét. 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élhetők vagy hozzáadhatók. Tartalomtípus fejléce
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. Fejléc eltérése

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

  • Az alkalmazásválaszok tömörítése Gzip és 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.

A választömörítés közbenső szoftverének konfigurálása

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ípusokhoz és tömörítési szolgáltatókhoz (Brotli és Gzip):

Az alábbi kód bemutatja, hogyan engedélyezheti a választömörítési köztes szoftvereket az alapértelmezett MIME-típusokhoz és tömörítési szolgáltatókhoz (Brotli, Gzip és Zstandard):

Megjegyzések a választömörítés közbenső szoftveréről

Amikor választömörítési köztes szoftverrel dolgozik, tartsa szem előtt a következő szempontokat:

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:

  1. Válassza a hálózat fület.
  2. 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.
  3. Változtassa meg a Accept-Encoding: értéket gzip, deflate, br-ról none-ra.
  4. 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.

Szolgáltatók áttekintése

Ez a szakasz részletesen ismerteti a tömörítési szolgáltatókat, köztük a Brotli, a Gzip és az egyéni szolgáltatókat.

Ez a szakasz részletesen ismerteti a tömörítési szolgáltatókat, például a Brotli, a Gzip, a Zstandard és az egyéni szolgáltatókat.

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

BrotliCompressionProvider Az osztály használatával tömörítse a válaszokat az RFC 7932: Brotli tömörített adatformátummal.

Ha a rendszer nem ad hozzá kifejezetten tömörítési szolgáltatókat az CompressionProviderCollection osztályhoz:

  • Alapértelmezés szerint a Brotli és a Gzip tömörítési szolgáltatók hozzáadódnak a tömörítési szolgáltatók tömbjéhez.
  • Ha az ügyfél támogatja a Brotli tömörített adatformátumot, a tömörítés alapértelmezés szerint Brotli-tömörítésre történik.
  • 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.
  • Alapértelmezés szerint a Brotli, a Gzip és a Zstandard tömörítési szolgáltatók hozzáadódnak a tömörítési szolgáltatók tömbjéhez.
  • Ha az ügyfél támogatja a Zstandard tömörített adatformátumot, a tömörítés alapértelmezés szerint Zstandard-tömörítésre történik.
  • Ha az ügyfél nem támogatja a Zstandardot, de támogatja a Brotli-t, a tömörítés alapértelmezés szerint Brotli-tömörítés lesz.
  • Ha az ügyfél nem támogatja a Zstandard vagy a Brotli használatá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.

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.

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 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();

Állítsa be a tömörítési szintet a BrotliCompressionProviderOptions és GzipCompressionProviderOptions osztályok használatával. A Brotli és a Gzip tömörítési szolgáltatók alapértelmezés szerint a tömörítési szint leggyorsabb szintjét határozzák meg a CompressionLevel.Leggyorsabb szám alapján. Előfordulhat azonban, hogy ez a módszer nem 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 választömörítés közbenső szoftverét az optimális tömörítés érdekében.

Azok az értékek, amelyek jelzik, hogy egy tömörítési művelet a sebességet vagy a tömörítési méretet hangsúlyozza-e, tekintse meg a CompressionLevel Enum című témakört.

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();

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

A ZstandardCompressionProvider osztály használatával tömörítse a válaszokat a RFC 8878: Zstandard Compression for HTTP szerint.

Állítsa be a tömörítési minőséget az ZstandardCompressionProviderOptions osztálysal. A Zstandard minőségi szintje 1 és 22 között mozog, ahol a magasabb értékek jobb tömörítést, de lassabb sebességet eredményeznek. Az alábbi példa a Zstandard tömörítési minőségét állítja be:

builder.Services.Configure<ZstandardCompressionProviderOptions>(options =>
{
    options.CompressionOptions = new ZstandardCompressionOptions
    {
        Quality = 6 // 1 to 22, higher = better compression, slower
    };
});

Egyéni szolgáltatók

Egyéni tömörítési implementációk létrehozása az ICompressionProvider illesztővel. A EncodingName tulajdonság az általa ICompressionProvider 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ódban a minta nem tömöríti a válasz törzsét. A minta azonban bemutatja, hol kell implementálni egy egyéni tömörítési algoritmust.

A MIME-típusok áttekintése

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. Tekintse át a forráskódot a támogatott MIME-típusok teljes listájához.

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.MimeTypes tulajdonsággal. A helyettesítő karakteres MIME-típusok, 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 válaszok a Accept-Encoding kérelemfejléc alapján vannak tömörítve, a válasz tömörítetlen és több tömörített verziója is lehet. Ha arra szeretné utasítani az ügyfél- és proxygyorsítótárakat, hogy több verzió is létezik, és tárolni kell őket, 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 ResponseCompressionBody.cs fájlhoz 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.

Nginx fordított proxyval kapcsolatos problémák

Amikor az Nginx proxyja a kérést, a Accept-Encoding fejléc el lesz távolítva. 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 dekompresszió. Ezt a problémát az GitHub dotnet/aspnetcore probléma #5989 - követi. Kitalálni az átviteli tömörítést az Nginxnél.

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 – Fejlesztői kiadás , amellyel beállíthatja a Accept-Encoding kérelem fejlécét, és tanulmányozhatja a válaszfejléceket, a méretet és a törzset. A választömörítés köztes szoftver alapértelmezés szerint az alábbi feltételeknek megfelelő válaszokat tömöríti:

  • A Accept-Encoding fejléc jelen van az br, gzip, * (csillag) értékkel, vagy olyan egyéni kódolással, amely megfelel egy egyéni tömörítési szolgáltatónak. Az érték nem lehet identity (kódolás nélkül), vagy nem lehet minőségi érték (qvalue, q) beállítása 0 (nulla).
  • A(z) Accept-Encoding fejléc jelen van, és az értéke br, gzip, zstd, * (csillag) vagy egy egyéni tömörítésszolgáltatónak megfelelő egyéni kódolás. Az érték nem lehet identity (kódolás nélkül), vagy nem lehet minőségi érték (qvalue, q) beállítása 0 (nulla).
  • A MIME típust (Content-Type) be kell állítani, és meg kell egyeznie az ResponseCompressionOptions osztályon konfigurált MIME-típussal.

  • A kérelem nem tartalmazhat tartalomtartomány fejlécet.

  • A kérésnek a nem biztonságos hypertext protokollt (http) kell használnia, kivéve, ha a biztonságos hypertext protokoll (https) konfigurálva van a választömörítés köztes szoftver beállításai között.

    Important

    Tekintse át a biztonságos tartalomtömörítés engedélyezésével kapcsolatos kockázatokat a jelen cikk korábbi, HTTPS-vel történő tömörítésében leírtak szerint.

A Azure üzembe helyezett minta áttekintése

A Azure ü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();

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 választömörítési köztes szoftvereket használni?

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 A 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 mintaalkalmazással megismerheti a választömörítési köztes szoftver funkcióit. 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ípusokhoz és tömörítési szolgáltatókhoz (Brotli és Gzip):

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 köztes szoftver.
  • 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.Fastest 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.Fastest 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. A választömörítés köztes szoftver alapértelmezés szerint az alábbi feltételeknek megfelelő válaszokat tömöríti:

  • 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 választömörítés köztes szoftver beállításaiban a biztonságos protokoll (https) van konfigurálva. Figyelje meg a fent leírt veszélyeket a biztonságos tartalomtömörítés engedélyezésekor.

További erőforrások