Meminta dekompresi di ASP.NET Core
Catatan
Ini bukan versi terbaru dari artikel ini. Untuk rilis saat ini, lihat versi .NET 8 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 8 dari artikel ini.
Penting
Informasi ini berkaitan dengan produk pra-rilis yang mungkin dimodifikasi secara substansial sebelum dirilis secara komersial. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.
Oleh David Acker
Meminta middleware dekompresi:
- Memungkinkan titik akhir API untuk menerima permintaan dengan konten terkompresi.
Content-Encoding
Menggunakan 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-Encoding
Menghapus 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 jenis defaultContent-Encoding
:UseRequestDecompression
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 .
MaxRequestBodySize
dapat 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