Kompresi respons di ASP.NET Core

Bandwidth jaringan adalah sumber daya terbatas. Mengurangi ukuran respons biasanya meningkatkan respons aplikasi, sering kali secara dramatis. Salah satu cara untuk mengurangi ukuran payload adalah dengan mengompresi respons aplikasi.

Pemadatan dengan HTTPS

Respons terkompresi melalui koneksi aman dapat dikontrol dengan EnableForHttps opsi , yang dinonaktifkan secara default karena risiko keamanan. Menggunakan kompresi dengan halaman yang dihasilkan secara dinamis dapat mengekspos aplikasi ke CRIME dan BREACH serangan. CRIME dan BREACH serangan dapat dimitigasi di ASP.NET Core dengan token antiforgery. Untuk informasi selengkapnya, lihat Mencegah serangan Pemalsuan Permintaan Antar Situs (XSRF/CSRF) di ASP.NET Core. Untuk informasi tentang mitigasi BREACH serangan, lihat mitigasi di http://www.breachattack.com/

Bahkan ketika EnableForHttps dinonaktifkan di aplikasi, IIS, IIS Express, dan Azure App Service dapat menerapkan gzip di server web IIS. Saat meninjau header respons, perhatikan nilai Server . Nilai header respons yang tidak terduga content-encoding mungkin merupakan hasil dari server web dan bukan konfigurasi aplikasi ASP.NET Core.

Kapan menggunakan Middleware Kompresi Respons

Gunakan teknologi kompresi respons berbasis server di IIS, Apache, atau Nginx. Performa middleware kompresi respons mungkin tidak akan cocok dengan modul server. HTTP.sys server dan Kestrel server saat ini tidak menawarkan dukungan kompresi bawaan.

Gunakan Middleware Kompresi Respons saat aplikasi:

Pemadatan respons

Biasanya, respons apa pun yang tidak dikompresi secara asli dapat memperoleh manfaat dari kompresi respons. Respons yang tidak dikompresi secara asli biasanya mencakup CSS, JavaScript, HTML, XML, dan JSON. Jangan kompres aset yang dikompresi secara asli, seperti file PNG. Ketika mencoba untuk lebih memadatkan respons terkompresi asli, pengurangan ukuran ekstra kecil dan waktu transmisi kemungkinan akan dibayangi oleh waktu yang diperlukan untuk memproses kompresi. Jangan memadatkan file yang lebih kecil dari sekitar 150-1000 byte, tergantung pada konten file dan efisiensi kompresi. Overhead mengompresi file kecil dapat menghasilkan file terkompresi yang lebih besar dari file yang tidak dikompresi.

Ketika klien dapat memproses konten terkompresi, klien harus menginformasikan server kemampuannya dengan mengirim Accept-Encoding header dengan permintaan. Saat server mengirim konten terkompresi, server harus menyertakan informasi di Content-Encoding header tentang bagaimana respons terkompresi dikodekan. Penunjukan pengodean konten yang didukung oleh middleware kompresi respons diperlihatkan dalam tabel berikut.

Accept-Encoding nilai header Middleware Didukung Deskripsi
br Ya (default) Format data terkompresi brotli
deflate No Format data terkompresi DEFLATE
exi No Pertukaran XML Efisien W3C
gzip Ya Format file Gzip
identity Ya Pengidentifikasi "Tidak ada pengodean": Respons tidak boleh dikodekan.
pack200-gzip No Format Transfer Jaringan untuk Arsip Java
* Ya Pengodean konten yang tersedia tidak diminta secara eksplisit

Untuk informasi selengkapnya, lihat Daftar Pengodian Konten Resmi IANA.

Middleware kompresi respons memungkinkan penambahan penyedia kompresi tambahan untuk nilai header kustom Accept-Encoding . Untuk informasi selengkapnya, lihat Penyedia Kustom di artikel ini.

Middleware kompresi respons mampu bereaksi terhadap nilai kualitas (qvalue, q) pembobotan saat dikirim oleh klien untuk memprioritaskan skema kompresi. Untuk informasi selengkapnya, lihat RFC 9110: Accept-Encoding.

Algoritma kompresi tunduk pada tradeoff antara kecepatan kompresi dan efektivitas kompresi. Efektivitas dalam konteks ini mengacu pada ukuran output setelah pemadatan. Ukuran terkecil dicapai oleh kompresi optimal.

Header yang terlibat dalam permintaan, pengiriman, penembolokan, dan penerimaan konten terkompresi dijelaskan dalam tabel berikut.

Header Peran
Accept-Encoding Dikirim dari klien ke server untuk menunjukkan skema pengodean konten yang dapat diterima oleh klien.
Content-Encoding Dikirim dari server ke klien untuk menunjukkan pengodean konten dalam payload.
Content-Length Ketika pemadatan terjadi, Content-Length header dihapus, karena konten isi berubah saat respons dikompresi.
Content-MD5 Ketika pemadatan terjadi, Content-MD5 header dihapus, karena konten isi telah berubah dan hash tidak lagi valid.
Content-Type Menentukan jenis KONTEN MIME. Setiap respons harus menentukan Content-Type. Middleware kompresi respons memeriksa nilai ini untuk menentukan apakah respons harus dikompresi. Middleware kompresi respons menentukan sekumpulan jenis MIME default yang dapat dikodekan, dan mereka dapat tidur diganti atau ditambahkan.
Vary Ketika dikirim oleh server dengan nilai Accept-Encoding untuk klien dan proksi, Vary header menunjukkan kepada klien atau proksi bahwa itu harus cache (bervariasi) respons berdasarkan nilai Accept-Encoding header permintaan. Hasil dari mengembalikan konten dengan Vary: Accept-Encoding header adalah bahwa respons terkompresi dan tidak dikompresi di-cache secara terpisah.

Jelajahi fitur Middleware Kompresi Respons dengan aplikasi sampel. Sampel mengilustrasikan:

  • Pemadatan respons aplikasi menggunakan Gzip dan penyedia kompresi kustom.
  • Cara menambahkan jenis MIME ke daftar default jenis MIME untuk pemadatan.
  • Cara menambahkan penyedia kompresi respons kustom.

Konfigurasi

Kode berikut menunjukkan cara mengaktifkan Middleware Kompresi Respons untuk jenis MIME default dan penyedia kompresi (Brotli dan Gzip):

var builder = WebApplication.CreateBuilder(args);

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

var app = builder.Build();

app.UseResponseCompression();

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

app.Run();

Catatan:

  • Pengaturan EnableForHttps ke true adalah risiko keamanan. Lihat Pemadatan dengan HTTPS di artikel ini untuk informasi selengkapnya.
  • app.UseResponseCompression harus dipanggil sebelum middleware apa pun yang mengompresi respons. Untuk informasi lebih lanjut, lihat Middleware ASP.NET Core.
  • Gunakan alat seperti Pengembang Browser Firefox untuk mengatur Accept-Encoding header permintaan dan memeriksa header, ukuran, dan isi respons.

Kirim permintaan ke aplikasi sampel tanpa Accept-Encoding header dan amati bahwa respons tidak dikompresi. Header Content-Encoding tidak ada di koleksi Header Respons.

Misalnya, di Pengembang Firefox:

  • Pilih tab jaringan.
  • Klik kanan permintaan di daftar Permintaan jaringan dan pilih Edit dan kirim ulang
  • Ubah Accept-Encoding: dari gzip, deflate, br ke none.
  • Pilih Kirim.

Kirim permintaan ke aplikasi sampel dengan browser menggunakan alat pengembang dan amati bahwa respons dikompresi. Header Content-Encoding dan Vary ada pada respons.

Penyedia

Penyedia kompresi Brotli dan Gzip

BrotliCompressionProvider Gunakan untuk memadatkan respons dengan format data terkompresi Brotli.

Jika tidak ada penyedia kompresi yang secara eksplisit ditambahkan ke CompressionProviderCollection:

  • Penyedia kompresi Brotli dan penyedia kompresi Gzip ditambahkan secara default ke array penyedia kompresi.
  • Kompresi default ke kompresi Brotli saat format data terkompresi Brotli didukung oleh klien. Jika Brotli tidak didukung oleh klien, kompresi default ke Gzip saat klien mendukung kompresi Gzip.

Catatan

Tautan dokumentasi ke sumber referensi .NET biasanya memuat cabang default repositori, yang mewakili pengembangan saat ini untuk rilis .NET berikutnya. Untuk memilih tag rilis tertentu, gunakan daftar dropdown Beralih cabang atau tag. Untuk informasi lebih lanjut, lihat Cara memilih tag versi kode sumber ASP.NET Core (dotnet/AspNetCore.Docs #26205).

Saat penyedia kompresi ditambahkan, penyedia lain tidak ditambahkan. Misalnya, jika penyedia kompresi Gzip adalah satu-satunya penyedia yang ditambahkan secara eksplisit, tidak ada penyedia kompresi lain yang ditambahkan.

Kode berikut:

  • Mengaktifkan kompresi respons untuk permintaan HTTPS.
  • Menambahkan penyedia kompresi respons Brotli dan Gzip.
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();

Atur tingkat kompresi dengan BrotliCompressionProviderOptions dan GzipCompressionProviderOptions. Penyedia kompresi Brotli dan Gzip default ke tingkat kompresi tercepat, CompressionLevel.Fastest, yang mungkin tidak menghasilkan kompresi yang paling efisien. Jika kompresi yang paling efisien diinginkan, konfigurasikan middleware kompresi respons untuk pemadatan optimal.

Lihat Enum CompressionLevel untuk nilai yang menunjukkan apakah operasi pemadatan menekankan kecepatan atau ukuran kompresi.

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

Penyedia kustom

Buat implementasi kompresi kustom dengan ICompressionProvider. EncodingName mewakili pengodean konten yang dihasilkan iniICompressionProvider. Middleware kompresi respons menggunakan informasi ini untuk memilih penyedia berdasarkan daftar yang ditentukan di Accept-Encoding header permintaan.

Permintaan ke aplikasi sampel dengan Accept-Encoding: mycustomcompression header mengembalikan respons dengan Content-Encoding: mycustomcompression header. Klien harus dapat mendekompresi pengodean kustom agar implementasi kompresi kustom berfungsi.

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

Dengan kode sebelumnya, isi respons tidak dikompresi oleh sampel. Namun, sampel menunjukkan tempat menerapkan algoritma kompresi kustom.

Jenis MIME

Middleware kompresi respons menentukan sekumpulan jenis MIME default untuk pemadatan. Lihat kode sumber untuk daftar lengkap jenis MIME yang didukung.

Catatan

Tautan dokumentasi ke sumber referensi .NET biasanya memuat cabang default repositori, yang mewakili pengembangan saat ini untuk rilis .NET berikutnya. Untuk memilih tag rilis tertentu, gunakan daftar dropdown Beralih cabang atau tag. Untuk informasi lebih lanjut, lihat Cara memilih tag versi kode sumber ASP.NET Core (dotnet/AspNetCore.Docs #26205).

Ganti atau tambahkan jenis MIME dengan ResponseCompressionOptions.MimeTypes. Perhatikan bahwa jenis MIME wildcard, seperti text/* tidak didukung. Aplikasi sampel menambahkan jenis MIME untuk image/svg+xml dan memadatkan dan menyajikan gambar banner ASP.NET Core 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();

Menambahkan header Vary

Saat mengompresi respons berdasarkan Accept-Encoding header permintaan, ada dapat tidak dikompresi dan beberapa versi respons yang dikompresi. Untuk menginstruksikan cache klien dan proksi bahwa beberapa versi ada dan harus disimpan, Vary header ditambahkan dengan Accept-Encoding nilai. Middleware respons menambahkan Vary header secara otomatis saat respons dikompresi.

Catatan

Tautan dokumentasi ke sumber referensi .NET biasanya memuat cabang default repositori, yang mewakili pengembangan saat ini untuk rilis .NET berikutnya. Untuk memilih tag rilis tertentu, gunakan daftar dropdown Beralih cabang atau tag. Untuk informasi lebih lanjut, lihat Cara memilih tag versi kode sumber ASP.NET Core (dotnet/AspNetCore.Docs #26205).

Masalah middleware saat berada di belakang proksi terbalik Nginx

Ketika permintaan diproksi oleh Nginx, Accept-Encoding header dihapus. Accept-Encoding Penghapusan header mencegah middleware kompresi respons mengompresi respons. Untuk informasi selengkapnya, lihat NGINX: Pemadatan dan Dekompresi. Masalah ini dilacak oleh Gambar kompresi pass-through untuk Nginx (dotnet/aspnetcore#5989).

Menonaktifkan kompresi dinamis IIS

Untuk menonaktifkan Modul Kompresi Dinamis IIS yang dikonfigurasi di tingkat server, lihat Menonaktifkan modul IIS.

Memecahkan masalah kompresi respons

Gunakan alat seperti Firefox Browser Developer, yang memungkinkan pengaturan Accept-Encoding header permintaan dan mempelajari header respons, ukuran, dan isi. Secara default, Middleware Kompresi Respons memadatkan respons yang memenuhi kondisi berikut:

  • Header Accept-Encoding hadir dengan nilai br, , gzip, *atau pengodean kustom yang cocok dengan penyedia kompresi kustom. Nilai tidak boleh identity atau memiliki nilai kualitas (qvalue, q) pengaturan 0 (nol).
  • Jenis MIME (Content-Type) harus diatur dan harus cocok dengan jenis MIME yang dikonfigurasi pada ResponseCompressionOptions.
  • Permintaan tidak boleh menyertakan Content-Range header.
  • Permintaan harus menggunakan protokol yang tidak aman (http), kecuali protokol aman (https) dikonfigurasi dalam opsi Middleware Kompresi Respons. Perhatikan bahaya yang dijelaskan di atas saat mengaktifkan pemadatan konten aman.

Sampel yang disebarkan Azure

Aplikasi sampel yang disebarkan ke Azure memiliki file berikut Program.cs :

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

Sumber Daya Tambahan:

Catatan

Tautan dokumentasi ke sumber referensi .NET biasanya memuat cabang default repositori, yang mewakili pengembangan saat ini untuk rilis .NET berikutnya. Untuk memilih tag rilis tertentu, gunakan daftar dropdown Beralih cabang atau tag. Untuk informasi lebih lanjut, lihat Cara memilih tag versi kode sumber ASP.NET Core (dotnet/AspNetCore.Docs #26205).

Bandwidth jaringan adalah sumber daya terbatas. Mengurangi ukuran respons biasanya meningkatkan respons aplikasi, sering kali secara dramatis. Salah satu cara untuk mengurangi ukuran payload adalah dengan mengompresi respons aplikasi.

Melihat atau mengunduh kode sampel (cara mengunduh)

Kapan menggunakan Middleware Kompresi Respons

Gunakan teknologi kompresi respons berbasis server di IIS, Apache, atau Nginx. Performa middleware mungkin tidak akan cocok dengan modul server. HTTP.sys server dan Kestrel server saat ini tidak menawarkan dukungan kompresi bawaan.

Gunakan Middleware Kompresi Respons saat Anda:

Pemadatan respons

Biasanya, respons apa pun yang tidak dikompresi secara asli dapat memperoleh manfaat dari kompresi respons. Respons yang tidak dikompresi secara asli biasanya meliputi: CSS, JavaScript, HTML, XML, dan JSON. Anda tidak boleh mengompresi aset terkompresi asli, seperti file PNG. Jika Anda mencoba untuk lebih mengompres respons terkompresi asli, pengurangan ukuran dan waktu transmisi tambahan kecil kemungkinan akan dibayangi oleh waktu yang diperlukan untuk memproses kompresi. Jangan memadatkan file yang lebih kecil dari sekitar 150-1000 byte (tergantung pada konten file dan efisiensi kompresi). Overhead mengompresi file kecil dapat menghasilkan file terkompresi yang lebih besar dari file yang tidak dikompresi.

Ketika klien dapat memproses konten terkompresi, klien harus menginformasikan server kemampuannya dengan mengirim Accept-Encoding header dengan permintaan. Saat server mengirim konten terkompresi, server harus menyertakan informasi di Content-Encoding header tentang bagaimana respons terkompresi dikodekan. Penetapan pengodean konten yang didukung oleh middleware diperlihatkan dalam tabel berikut.

Accept-Encoding nilai header Middleware Didukung Deskripsi
br Ya (default) Format data terkompresi brotli
deflate No Format data terkompresi DEFLATE
exi No Pertukaran XML Efisien W3C
gzip Ya Format file Gzip
identity Ya Pengidentifikasi "Tidak ada pengodean": Respons tidak boleh dikodekan.
pack200-gzip No Format Transfer Jaringan untuk Arsip Java
* Ya Pengodean konten yang tersedia tidak diminta secara eksplisit

Untuk informasi selengkapnya, lihat Daftar Pengodian Konten Resmi IANA.

Middleware memungkinkan Anda menambahkan penyedia kompresi tambahan untuk nilai header kustom Accept-Encoding . Untuk informasi selengkapnya, lihat Penyedia Kustom di bawah ini.

Middleware mampu bereaksi terhadap pembobotan nilai kualitas (qvalue, q) saat dikirim oleh klien untuk memprioritaskan skema kompresi. Untuk informasi selengkapnya, lihat RFC 9110: Accept-Encoding.

Algoritma kompresi tunduk pada tradeoff antara kecepatan kompresi dan efektivitas kompresi. Efektivitas dalam konteks ini mengacu pada ukuran output setelah pemadatan. Ukuran terkecil dicapai oleh kompresi yang paling optimal .

Header yang terlibat dalam meminta, mengirim, membuat cache, dan menerima konten terkompresi dijelaskan dalam tabel di bawah ini.

Header Peran
Accept-Encoding Dikirim dari klien ke server untuk menunjukkan skema pengodean konten yang dapat diterima oleh klien.
Content-Encoding Dikirim dari server ke klien untuk menunjukkan pengodean konten dalam payload.
Content-Length Ketika pemadatan terjadi, Content-Length header dihapus, karena konten isi berubah saat respons dikompresi.
Content-MD5 Ketika pemadatan terjadi, Content-MD5 header dihapus, karena konten isi telah berubah dan hash tidak lagi valid.
Content-Type Menentukan jenis KONTEN MIME. Setiap respons harus menentukan Content-Type. Middleware memeriksa nilai ini untuk menentukan apakah respons harus dikompresi. Middleware menentukan sekumpulan jenis MIME default yang dapat dikodekan, tetapi Anda dapat mengganti atau menambahkan jenis MIME.
Vary Ketika dikirim oleh server dengan nilai Accept-Encoding untuk klien dan proksi, Vary header menunjukkan kepada klien atau proksi bahwa itu harus cache (bervariasi) respons berdasarkan nilai Accept-Encoding header permintaan. Hasil dari mengembalikan konten dengan Vary: Accept-Encoding header adalah bahwa respons terkompresi dan tidak dikompresi di-cache secara terpisah.

Jelajahi fitur Middleware Kompresi Respons dengan aplikasi sampel. Sampel mengilustrasikan:

  • Pemadatan respons aplikasi menggunakan Gzip dan penyedia kompresi kustom.
  • Cara menambahkan jenis MIME ke daftar default jenis MIME untuk pemadatan.

Konfigurasi

Kode berikut menunjukkan cara mengaktifkan Middleware Kompresi Respons untuk jenis MIME default dan penyedia kompresi (Brotli dan Gzip):

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

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

Catatan:

  • app.UseResponseCompression harus dipanggil sebelum middleware apa pun yang mengompresi respons. Untuk informasi lebih lanjut, lihat Middleware ASP.NET Core.
  • Gunakan alat seperti Fiddler, Pengembang Browser Firefox untuk mengatur Accept-Encoding header permintaan dan mempelajari header respons, ukuran, dan isi.

Kirim permintaan ke aplikasi sampel tanpa Accept-Encoding header dan amati bahwa respons tidak dikompresi. Header Content-Encoding dan Vary tidak ada pada respons.

Fiddler window showing result of a request without the Accept-Encoding header. The response isn't compressed.

Kirim permintaan ke aplikasi sampel dengan Accept-Encoding: br header (kompresi Brotli) dan amati bahwa respons dikompresi. Header Content-Encoding dan Vary ada pada respons.

Fiddler window showing result of a request with the Accept-Encoding header and a value of br. The Vary and Content-Encoding headers are added to the response. The response is compressed.

Penyedia

Penyedia Kompresi Brotli

BrotliCompressionProvider Gunakan untuk memadatkan respons dengan format data terkompresi Brotli.

Jika tidak ada penyedia kompresi yang secara eksplisit ditambahkan ke CompressionProviderCollection:

  • Penyedia Kompresi Brotli ditambahkan secara default ke array penyedia kompresi bersama dengan penyedia kompresi Gzip.
  • Kompresi default ke kompresi Brotli saat format data terkompresi Brotli didukung oleh klien. Jika Brotli tidak didukung oleh klien, kompresi default ke Gzip saat klien mendukung kompresi Gzip.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();
}

Penyedia Kompresi Brotli harus ditambahkan ketika penyedia kompresi ditambahkan secara eksplisit:

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

Atur tingkat kompresi dengan BrotliCompressionProviderOptions. Penyedia Kompresi Brotli default ke tingkat kompresi tercepat (CompressionLevel.Fastest), yang mungkin tidak menghasilkan kompresi yang paling efisien. Jika kompresi yang paling efisien diinginkan, konfigurasikan middleware untuk pemadatan optimal.

Tingkat Pemadatan Deskripsi
CompressionLevel.Fastest Pemadatan harus selesai secepat mungkin, bahkan jika output yang dihasilkan tidak dikompresi secara optimal.
CompressionLevel.NoCompression Tidak ada kompresi yang harus dilakukan.
CompressionLevel.Optimal Respons harus dikompresi secara optimal, bahkan jika kompresi membutuhkan lebih banyak waktu untuk diselesaikan.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();

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

Penyedia Kompresi Gzip

GzipCompressionProvider Gunakan untuk mengompresi respons dengan format file Gzip.

Jika tidak ada penyedia kompresi yang secara eksplisit ditambahkan ke CompressionProviderCollection:

  • Penyedia Kompresi Gzip ditambahkan secara default ke array penyedia kompresi bersama dengan Penyedia Kompresi Brotli.
  • Kompresi default ke kompresi Brotli saat format data terkompresi Brotli didukung oleh klien. Jika Brotli tidak didukung oleh klien, kompresi default ke Gzip saat klien mendukung kompresi Gzip.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();
}

Penyedia Kompresi Gzip harus ditambahkan ketika penyedia kompresi ditambahkan secara eksplisit:

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

Atur tingkat kompresi dengan GzipCompressionProviderOptions. Penyedia Kompresi Gzip default ke tingkat kompresi tercepat (CompressionLevel.Fastest), yang mungkin tidak menghasilkan kompresi yang paling efisien. Jika kompresi yang paling efisien diinginkan, konfigurasikan middleware untuk pemadatan optimal.

Tingkat Pemadatan Deskripsi
CompressionLevel.Fastest Pemadatan harus selesai secepat mungkin, bahkan jika output yang dihasilkan tidak dikompresi secara optimal.
CompressionLevel.NoCompression Tidak ada kompresi yang harus dilakukan.
CompressionLevel.Optimal Respons harus dikompresi secara optimal, bahkan jika kompresi membutuhkan lebih banyak waktu untuk diselesaikan.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();

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

Penyedia kustom

Buat implementasi kompresi kustom dengan ICompressionProvider. EncodingName mewakili pengodean konten yang dihasilkan iniICompressionProvider. Middleware menggunakan informasi ini untuk memilih penyedia berdasarkan daftar yang ditentukan di Accept-Encoding header permintaan.

Dengan menggunakan aplikasi sampel, klien mengirimkan permintaan dengan Accept-Encoding: mycustomcompression header . Middleware menggunakan implementasi kompresi kustom dan mengembalikan respons dengan Content-Encoding: mycustomcompression header. Klien harus dapat mendekompresi pengodean kustom agar implementasi kompresi kustom berfungsi.

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

Kirim permintaan ke aplikasi sampel dengan Accept-Encoding: mycustomcompression header dan amati header respons. Header Vary dan Content-Encoding ada pada respons. Isi respons (tidak ditampilkan) tidak dikompresi oleh sampel. Tidak ada implementasi kompresi di CustomCompressionProvider kelas sampel. Namun, sampel menunjukkan di mana Anda akan menerapkan algoritma kompresi seperti itu.

Fiddler window showing result of a request with the Accept-Encoding header and a value of mycustomcompression. The Vary and Content-Encoding headers are added to the response.

Jenis MIME

Middleware menentukan sekumpulan jenis MIME default untuk pemadatan:

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

Ganti atau tambahkan jenis MIME dengan opsi Middleware Kompresi Respons. Perhatikan bahwa jenis MIME wildcard, seperti text/* tidak didukung. Aplikasi sampel menambahkan jenis MIME untuk image/svg+xml dan memadatkan dan menyajikan gambar banner ASP.NET Core (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" });
    });
}

Pemadatan dengan protokol aman

Respons terkompresi melalui koneksi aman dapat dikontrol dengan EnableForHttps opsi , yang dinonaktifkan secara default. Menggunakan kompresi dengan halaman yang dihasilkan secara dinamis dapat menyebabkan masalah keamanan seperti CRIME serangan dan BREACH .

Menambahkan header Vary

Saat mengompresi respons berdasarkan Accept-Encoding header, berpotensi ada beberapa versi respons yang dikompresi dan versi yang tidak dikompresi. Untuk menginstruksikan cache klien dan proksi bahwa beberapa versi ada dan harus disimpan, Vary header ditambahkan dengan Accept-Encoding nilai. Di ASP.NET Core 2.0 atau yang lebih baru, middleware menambahkan Vary header secara otomatis saat respons dikompresi.

Masalah middleware saat berada di belakang proksi terbalik Nginx

Ketika permintaan diproksi oleh Nginx, Accept-Encoding header dihapus. Accept-Encoding Penghapusan header mencegah middleware mengompresi respons. Untuk informasi selengkapnya, lihat NGINX: Pemadatan dan Dekompresi. Masalah ini dilacak oleh Gambar kompresi pass-through untuk Nginx (dotnet/aspnetcore#5989).

Bekerja dengan kompresi dinamis IIS

Jika Anda memiliki Modul Kompresi Dinamis IIS aktif yang dikonfigurasi di tingkat server yang ingin Anda nonaktifkan untuk aplikasi, nonaktifkan modul dengan tambahan ke file web.config . Untuk informasi selengkapnya, lihat Menonaktifkan modul IIS.

Pemecahan Masalah

Gunakan alat seperti Fiddler atau Firefox Browser Developer, yang memungkinkan Anda mengatur Accept-Encoding header permintaan dan mempelajari header, ukuran, dan isi respons. Secara default, Middleware Kompresi Respons memadatkan respons yang memenuhi kondisi berikut:

  • Header Accept-Encoding hadir dengan nilai br, , gzip, *atau pengodean kustom yang cocok dengan penyedia kompresi kustom yang telah Anda tetapkan. Nilai tidak boleh identity atau memiliki nilai kualitas (qvalue, q) pengaturan 0 (nol).
  • Jenis MIME (Content-Type) harus diatur dan harus cocok dengan jenis MIME yang dikonfigurasi pada ResponseCompressionOptions.
  • Permintaan tidak boleh menyertakan Content-Range header.
  • Permintaan harus menggunakan protokol yang tidak aman (http), kecuali protokol aman (https) dikonfigurasi dalam opsi Middleware Kompresi Respons. Perhatikan bahaya yang dijelaskan di atas saat mengaktifkan pemadatan konten aman.

Sumber Daya Tambahan: