Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Catatan
Ini bukan versi terbaru dari artikel ini. Untuk rilis saat ini, lihat versi .NET 10 dari artikel ini.
Peringatan
Versi ASP.NET Core ini tidak lagi didukung. Untuk informasi selengkapnya, lihat Kebijakan Dukungan .NET dan .NET Core. Untuk rilis saat ini, lihat versi .NET 9 dari artikel ini.
Oleh David Acker
Meminta middleware dekompresi:
- Memungkinkan titik akhir API untuk menerima permintaan dengan konten terkompresi.
-
Content-EncodingMenggunakan header HTTP untuk mengidentifikasi dan mendekompresi permintaan secara otomatis yang berisi konten terkompresi. - Menghilangkan kebutuhan untuk menulis kode untuk menangani permintaan terkompresi.
Content-Encoding Ketika nilai header pada permintaan cocok dengan salah satu penyedia dekompresi yang tersedia, middleware:
- Menggunakan penyedia yang cocok untuk membungkus HttpRequest.Body dalam aliran dekompresi yang sesuai.
-
Content-EncodingMenghapus header, menunjukkan bahwa isi permintaan tidak lagi dikompresi.
Permintaan yang tidak menyertakan Content-Encoding header diabaikan oleh middleware dekompresi permintaan.
Dekompresi:
- Terjadi ketika isi permintaan dibaca. Artinya, dekompresi terjadi di titik akhir pada pengikatan model. Isi permintaan tidak didekompresi dengan bersemangat.
- Saat mencoba membaca isi permintaan yang didekompresi dengan data terkompresi yang tidak valid untuk yang ditentukan
Content-Encoding, pengecualian dilemparkan. Brotli dapat melemparkan System.InvalidOperationException: Decoder ran into invalid data. Deflate dan GZip dapat melemparkan System.IO.InvalidDataException: The archive entry was compressed using an unsupported compression method.
Jika middleware menemukan permintaan dengan konten terkompresi tetapi tidak dapat mendekompresinya, permintaan diteruskan ke delegasi berikutnya dalam alur. Misalnya, permintaan dengan nilai header yang tidak didukung Content-Encoding atau beberapa Content-Encoding nilai header diteruskan ke delegasi berikutnya dalam alur.
Konfigurasi
Kode berikut menggunakan AddRequestDecompression(IServiceCollection) dan untuk mengaktifkan dekompresi permintaan untuk UseRequestDecompression:Content-Encoding
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRequestDecompression();
var app = builder.Build();
app.UseRequestDecompression();
app.MapPost("/", (HttpRequest request) => Results.Stream(request.Body));
app.Run();
Penyedia dekompresi default
Nilai Content-Encoding header yang didukung middleware dekompresi permintaan secara default tercantum dalam tabel berikut:
Content-Encoding nilai header |
Deskripsi |
|---|---|
br |
Format data terkompresi brotli |
deflate |
Format data terkompresi DEFLATE |
gzip |
Format file Gzip |
Penyedia dekompresi kustom
Dukungan untuk pengodean kustom dapat ditambahkan dengan membuat kelas penyedia dekompresi kustom yang mengimplementasikan IDecompressionProvider:
public class CustomDecompressionProvider : IDecompressionProvider
{
public Stream GetDecompressionStream(Stream stream)
{
// Perform custom decompression logic here
return stream;
}
}
Penyedia dekompresi kustom didaftarkan bersama dengan RequestDecompressionOptions nilai header yang Content-Encoding sesuai:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRequestDecompression(options =>
{
options.DecompressionProviders.Add("custom", new CustomDecompressionProvider());
});
var app = builder.Build();
app.UseRequestDecompression();
app.MapPost("/", (HttpRequest request) => Results.Stream(request.Body));
app.Run();
Batas ukuran permintaan
Untuk melindungi dari bom zip atau bom dekompresi:
- Ukuran maksimum isi permintaan yang didekompresi terbatas pada batas ukuran isi permintaan yang diberlakukan oleh titik akhir atau server.
- Jika jumlah byte yang dibaca dari aliran isi permintaan yang didekompresi melebihi batas, InvalidOperationException dilemparkan untuk mencegah byte tambahan dibaca dari aliran.
Dalam urutan prioritas, ukuran permintaan maksimum untuk titik akhir diatur oleh:
- IRequestSizeLimitMetadata.MaxRequestBodySize, seperti RequestSizeLimitAttribute atau DisableRequestSizeLimitAttribute untuk titik akhir MVC.
- Batas IHttpMaxRequestBodySizeFeature.MaxRequestBodySizeukuran server global .
MaxRequestBodySizedapat ditimpa per permintaan dengan IHttpMaxRequestBodySizeFeature.MaxRequestBodySize, tetapi default ke batas yang dikonfigurasi untuk implementasi server web.
| Implementasi server web |
MaxRequestBodySize konfigurasi |
|---|---|
| HTTP.sys | HttpSysOptions.MaxRequestBodySize |
| IIS | IISServerOptions.MaxRequestBodySize |
| Kestrel | KestrelServerLimits.MaxRequestBodySize |
Peringatan
Menonaktifkan batas ukuran isi permintaan menimbulkan risiko keamanan sehubungan dengan konsumsi sumber daya yang tidak terkendali, terutama jika isi permintaan sedang di-buffer. Pastikan bahwa perlindungan diberlakukan untuk mengurangi risiko serangan denial-of-service (DoS).
Sumber Tambahan
ASP.NET Core