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.
Nota
Ini bukan versi terbaru dari artikel ini. Untuk rilis saat ini, lihat versi artikel .NET 10 ini.
Peringatan
Versi ASP.NET Core ini tidak lagi didukung. Untuk informasi selengkapnya, lihat Kebijakan Dukungan Inti .NET dan .NET. Untuk rilis saat ini, lihat versi artikel .NET 10 ini.
- API minimal
- Controller
Artikel ini menjelaskan cara menangani kesalahan di API ASP.NET Core. Dokumentasi API Minimal telah dipilih. Untuk melihat dokumentasi API berbasis pengontrol, pilih tab Kontrol. Untuk panduan penanganan kesalahan Blazor, lihat kesalahan Handle di aplikasi ASP.NET Core Blazor.
Halaman Pengecualian Pengembang
Halaman Pengecualian Pengembang menampilkan informasi terperinci tentang pengecualian permintaan yang tidak tertangani. Ini menggunakan untuk menangkap pengecualian sinkron dan asinkron dari alur HTTP dan untuk menghasilkan respons kesalahan. Halaman pengecualian pengembang berjalan lebih awal di alur middleware, sehingga dapat menangkap pengecualian yang tidak tertangani yang dilemparkan dalam middleware yang mengikuti.
Aplikasi ASP.NET Core mengaktifkan halaman pengecualian pengembang secara default saat dengan keduanya:
- Beroperasi di lingkungan.
- Aplikasi ini dibuat dengan templat saat ini, yaitu dengan menggunakan .
Aplikasi yang dibuat menggunakan templat sebelumnya, yaitu, dengan menggunakan , dapat mengaktifkan halaman pengecualian pengembang dengan memanggil .
Peringatan
Jangan aktifkan Halaman Pengecualian Pengembang kecuali aplikasi berjalan di lingkungan. Jangan bagikan informasi pengecualian terperinci secara publik saat aplikasi berjalan dalam produksi. Untuk informasi selengkapnya tentang mengonfigurasi lingkungan, lihat lingkungan runtime ASP.NET Core.
Halaman Pengecualian Pengembang dapat menyertakan informasi berikut tentang pengecualian dan permintaan:
- Pelacakan tumpukan
- Parameter string kueri, jika ada
- Cookie, jika ada
- Headers
- Metadata untuk titik akhir, jika ada
Halaman Pengecualian Pengembang tidak dijamin untuk memberikan informasi apa pun. Gunakan Pengelogan untuk informasi kesalahan lengkap.
Gambar berikut menunjukkan contoh halaman pengecualian pengembang dengan animasi untuk memperlihatkan tab dan informasi yang ditampilkan:
Halaman pengecualian pengembang dianimasikan untuk menampilkan setiap tab yang dipilih.
Menanggapi permintaan dengan header, Halaman Pengecualian Pengembang mengembalikan teks biasa alih-alih HTML. Contohnya:
Status: 500 Internal Server Error
Time: 9.39 msSize: 480 bytes
FormattedRawHeadersRequest
Body
text/plain; charset=utf-8, 480 bytes
System.InvalidOperationException: Sample Exception
at WebApplicationMinimal.Program.<>c.<Main>b__0_0() in C:\Source\WebApplicationMinimal\Program.cs:line 12
at lambda_method1(Closure, Object, HttpContext)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)
HEADERS
=======
Accept: text/plain
Host: localhost:7267
traceparent: 00-0eab195ea19d07b90a46cd7d6bf2f
- API minimal
- Controller
Untuk melihat Halaman Pengecualian Pengembang di API Minimal:
- Jalankan aplikasi sampel di lingkungan.
- Akses endpoint.
Bagian ini mengacu pada aplikasi sampel berikut untuk menunjukkan cara menangani pengecualian dalam API Minimal. Ini melemparkan pengecualian ketika titik akhir diminta:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/exception", () =>
{
throw new InvalidOperationException("Sample Exception");
});
app.MapGet("/", () => "Test by calling /exception");
app.Run();
Penangan pengecualian
Di lingkungan non-pengembangan, gunakan Middleware Penanganan Pengecualian untuk menghasilkan muatan kesalahan.
- API minimal
- Controller
Untuk mengonfigurasi , panggil . Misalnya, kode berikut mengubah aplikasi agar merespons klien dengan payload yang sesuai dengan standar RFC 7807. Untuk informasi selengkapnya, lihat bagian Detail Masalah nanti di artikel ini.
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.UseExceptionHandler(exceptionHandlerApp
=> exceptionHandlerApp.Run(async context
=> await Results.Problem()
.ExecuteAsync(context)));
app.MapGet("/exception", () =>
{
throw new InvalidOperationException("Sample Exception");
});
app.MapGet("/", () => "Test by calling /exception");
app.Run();
Respons kesalahan Klien dan Server
- API minimal
- Controller
Pertimbangkan aplikasi API Minimal berikut.
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/users/{id:int}", (int id)
=> id <= 0 ? Results.BadRequest() : Results.Ok(new User(id)));
app.MapGet("/", () => "Test by calling /users/{id:int}");
app.Run();
public record User(int Id);
Endpoint menghasilkan representasi ketika nilai lebih besar dari , jika tidak, hanya menghasilkan kode status tanpa isi respons. Untuk informasi selengkapnya tentang membuat respons, lihat Membuat respons di aplikasi API Minimal.
dapat dikonfigurasi untuk menghasilkan konten isi umum, ketika kosong, untuk semua respons klien HTTP () atau server (). Middleware dikonfigurasi dengan memanggil metode ekstensi UseStatusCodePages .
Misalnya, contoh berikut mengkonfigurasi aplikasi agar merespons dengan muatan data yang mematuhi RFC 7807 kepada klien untuk semua respons klien dan server, termasuk kesalahan perutean (misalnya, ). Untuk informasi selengkapnya, lihat bagian Detail Masalah .
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.UseStatusCodePages(async statusCodeContext
=> await Results.Problem(statusCode: statusCodeContext.HttpContext.Response.StatusCode)
.ExecuteAsync(statusCodeContext.HttpContext));
app.MapGet("/users/{id:int}", (int id)
=> id <= 0 ? Results.BadRequest() : Results.Ok(new User(id)) );
app.MapGet("/", () => "Test by calling /users/{id:int}");
app.Run();
public record User(int Id);
Detail masalah
Detail Masalah bukan satu-satunya format respons untuk menjelaskan kesalahan API HTTP, namun, biasanya digunakan untuk melaporkan kesalahan untuk API HTTP.
Layanan detail masalah mengimplementasikan antarmuka IProblemDetailsService, yang mendukung pembuatan detail masalah dalam ASP.NET Core. Metode ekstensi pada sistem ini mendaftarkan implementasi bawaan.
Dalam aplikasi ASP.NET Core, middleware berikut menghasilkan respons HTTP detail masalah saat
- : Menghasilkan respons detail masalah saat handler kustom tidak ditentukan.
- : Menghasilkan respons detail masalah secara default.
- : Menghasilkan respons detail masalah dalam pengembangan ketika header HTTP permintaan tidak menyertakan .
- API minimal
- Controller
Aplikasi API minimal dapat dikonfigurasi untuk menghasilkan respons detail masalah untuk semua respons kesalahan klien HTTP dan server yang belum memiliki konten isi dengan menggunakan metode ekstensi.
Kode berikut mengonfigurasi aplikasi untuk menghasilkan detail masalah:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddProblemDetails();
var app = builder.Build();
app.UseExceptionHandler();
app.UseStatusCodePages();
app.MapGet("/users/{id:int}", (int id)
=> id <= 0 ? Results.BadRequest() : Results.Ok(new User(id)));
app.MapGet("/", () => "Test by calling /users/{id:int}");
app.Run();
public record User(int Id);
Untuk informasi selengkapnya tentang menggunakan , lihat Detail Masalah
Fallback IProblemDetailsService
Dalam kode berikut, mengembalikan kesalahan jika implementasi tidak dapat menghasilkan :
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddProblemDetails();
var app = builder.Build();
app.UseExceptionHandler(exceptionHandlerApp =>
{
exceptionHandlerApp.Run(async httpContext =>
{
var pds = httpContext.RequestServices.GetService<IProblemDetailsService>();
if (pds == null
|| !await pds.TryWriteAsync(new() { HttpContext = httpContext }))
{
// Fallback behavior
await httpContext.Response.WriteAsync("Fallback: An error occurred.");
}
});
});
app.MapGet("/exception", () =>
{
throw new InvalidOperationException("Sample Exception");
});
app.MapGet("/", () => "Test by calling /exception");
app.Run();
Kode sebelumnya:
- Menulis pesan kesalahan dengan kode fallback jika tidak dapat menulis . Misalnya, titik akhir di mana header Permintaan terima menentukan jenis media yang tidak didukung.
- Menggunakan Middleware Penanganan Pengecualian.
Nota
mendukung jenis media berikut di header permintaan:
application/jsonapplication/problem+json- Jenis wildcard seperti dan
Jenis media non-JSON, seperti atau , tidak didukung dan akan memicu perilaku fallback.
Sampel berikut mirip dengan sebelumnya kecuali bahwa ia memanggil .
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddProblemDetails();
var app = builder.Build();
app.UseStatusCodePages(statusCodeHandlerApp =>
{
statusCodeHandlerApp.Run(async httpContext =>
{
var pds = httpContext.RequestServices.GetService<IProblemDetailsService>();
if (pds == null
|| !await pds.TryWriteAsync(new() { HttpContext = httpContext }))
{
// Fallback behavior
await httpContext.Response.WriteAsync("Fallback: An error occurred.");
}
});
});
app.MapGet("/users/{id:int}", (int id) =>
{
return id <= 0 ? Results.BadRequest() : Results.Ok(new User(id));
});
app.MapGet("/", () => "Test by calling /users/{id:int}");
app.Run();
public record User(int Id);
Fitur penanganan kesalahan tambahan
- API minimal
- Controller
Migrasi dari pengontrol ke API Minimal
Jika Anda bermigrasi dari API berbasis pengontrol ke API Minimal:
- Mengganti filter tindakan dengan filter titik akhir atau middleware
- Ganti validasi model dengan validasi manual atau pengikatan kustom
- Ganti filter pengecualian dengan middleware penanganan pengecualian
- Mengonfigurasi detail masalah menggunakan untuk respons kesalahan yang konsisten
Kapan menggunakan penanganan kesalahan berbasis pengontrol
Pertimbangkan API berbasis pengontrol jika Anda memerlukan:
- Skenario validasi model kompleks
- Penanganan pengecualian terpusat di beberapa pengontrol
- Kontrol terperinci atas pemformatan respons kesalahan
- Integrasi dengan fitur MVC seperti filter dan konvensi
Untuk informasi terperinci tentang penanganan kesalahan berbasis pengontrol, termasuk kesalahan validasi, kustomisasi detail masalah, dan filter pengecualian, lihat bagian tab Pengontrol .
Sumber daya tambahan
- Cara Menggunakan Validasi ModelState di ASP.NET CORE Web API
- Tampilkan atau unduh kode sampel
- Hellang.Middleware.ProblemDetails
ASP.NET Core