Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Uyarı
Bu, bu makalenin en son sürümü değildir. Geçerli sürüm için bu makalenin .NET 10 sürümüne bakın.
Uyarı
ASP.NET Core'un bu sürümü artık desteklenmiyor. Daha fazla bilgi için .NET ve .NET Core Destek Politikası'na bakın. Geçerli sürüm için bu makalenin .NET 9 sürümüne bakın.
Bu makalede, ASP.NET Çekirdek API'lerindeki hataların nasıl işleneceğini açıklanmaktadır. En Az API belgeleri seçildi. Denetleyici tabanlı API'lerin belgelerini görmek için Denetleyiciler sekmesini seçin. Hata işleme yönergeleri için Blazor bkz . ASP.NET Core Blazor uygulamalarında hataları işleme.
Geliştirici Özel Durum Sayfası
Geliştirici Özel Durum Sayfası, işlenmeyen istek özel durumları hakkında ayrıntılı bilgiler görüntüler. HTTP işlem hattından zaman uyumlu ve zaman uyumsuz özel durumları yakalamak ve hata yanıtları oluşturmak için kullanır DeveloperExceptionPageMiddleware . Geliştirici özel durum sayfası ara yazılım işlem hattında erken çalıştırılır, böylece izleyen ara yazılımda işlenmeyen özel durumları yakalayabilir.
ASP.NET Core uygulamaları, her ikisi de aşağıdaki durumlarda varsayılan olarak geliştirici özel durum sayfasını etkinleştirir:
- Geliştirme ortamında çalıştırılıyor.
- Uygulama, geçerli şablonlarla, yani kullanılarak WebApplication.CreateBuilderoluşturulmuştur.
Önceki şablonlar kullanılarak, yani kullanılarak WebHost.CreateDefaultBuilderoluşturulan uygulamalar, öğesini çağırarak app.UseDeveloperExceptionPagegeliştirici özel durum sayfasını etkinleştirebilir.
Uyarı
Uygulama Geliştirme ortamında çalışmadığı sürece Geliştirici Özel Durum Sayfası'nı etkinleştirmeyin. Uygulama üretimde çalışırken ayrıntılı özel durum bilgilerini herkese açık olarak paylaşmayın. Ortamları yapılandırma hakkında daha fazla bilgi için bkz. ASP.NET Core çalışma zamanı ortamları.
Geliştirici Özel Durum Sayfası, özel durum ve istek hakkında aşağıdaki bilgileri içerebilir:
- Yığın izleme
- Varsa sorgu dizesi parametreleri
- Varsa tanımlama bilgileri
- Headers
- Varsa uç nokta meta verileri
Geliştirici Özel Durum Sayfası'nın herhangi bir bilgi sağlaması garanti değildir. Tam hata bilgileri için Günlüğe Kaydetme özelliğini kullanın.
Aşağıdaki görüntüde, sekmeleri ve görüntülenen bilgileri gösteren animasyon içeren örnek bir geliştirici özel durum sayfası gösterilmektedir:
Üst bilgi içeren bir Accept: text/plain isteğe yanıt olarak, Geliştirici Özel Durum Sayfası HTML yerine düz metin döndürür. Örneğin:
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
En Az API'de Geliştirici Özel Durum Sayfasını görmek için:
- Örnek uygulamayı Geliştirme ortamında çalıştırın.
-
/exceptionUç noktaya gidin.
Bu bölüm, En Az API'de özel durumları işlemenin yollarını göstermek için aşağıdaki örnek uygulamaya başvurur. Uç nokta /exception istendiğinde bir özel durum oluşturur:
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();
Özel durum işleyicisi
Geliştirme dışı ortamlarda hata yükü oluşturmak için Özel Durum İşleyici ara yazılımını kullanın.
öğesini yapılandırmak için öğesini çağırınException Handler MiddlewareUseExceptionHandler. Örneğin, aşağıdaki kod uygulamayı istemciye RFC 7807 uyumlu bir yükle yanıt verecek şekilde değiştirir. Daha fazla bilgi için bu makalenin devamında yer alan Sorun Ayrıntıları bölümüne bakın.
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();
İstemci ve Sunucu hata yanıtları
Aşağıdaki Minimal API uygulamasını göz önünde bulundurun.
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);
Uç /users nokta 200 OKjson, ne zaman User değerinin değerinden id0 büyük olduğunu gösterir, aksi takdirde yanıt gövdesi olmayan bir 400 BAD REQUEST durum kodu oluşturur. Yanıt oluşturma hakkında daha fazla bilgi için bkz. Minimal API uygulamalarında yanıt oluşturma.
Status Code Pages middleware, tüm HTTP istemcisi () veya sunucu (400-499500 -) yanıtları için 599 ortak bir gövde içeriği üretecek şekilde yapılandırılabilir. Ara yazılım UseStatusCodePages uzantı yöntemi çağrılarak yapılandırılır.
Örneğin, aşağıdaki örnek uygulamayı yönlendirme hataları (örneğin, ) dahil olmak üzere tüm istemci ve sunucu yanıtları için istemciye 404 NOT FOUND uyumlu bir yükle yanıt verecek şekilde değiştirir. Daha fazla bilgi için Sorun Ayrıntıları bölümüne bakın.
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);
Sorun ayrıntıları
Sorun Ayrıntıları , HTTP API hatasını açıklayan tek yanıt biçimi değildir, ancak genellikle HTTP API'lerine yönelik hataları bildirmek için kullanılır.
Sorun ayrıntıları hizmeti, ASP.NET Core'da sorun ayrıntıları oluşturmayı destekleyen arabirimini uygular IProblemDetailsService .
AddProblemDetails(IServiceCollection) üzerindeki IServiceCollection uzantı yöntemi, varsayılan IProblemDetailsService uygulamayı kaydeder.
ASP.NET Core uygulamalarında aşağıdaki ara yazılım, AddProblemDetailsAccept http yanıtlarıyla ilgili sorun ayrıntıları oluşturur (varsayılan: ):IProblemDetailsWriter
- ExceptionHandlerMiddleware: Özel işleyici tanımlanmadığında bir sorun ayrıntıları yanıtı oluşturur.
- StatusCodePagesMiddleware: Varsayılan olarak bir sorun ayrıntıları yanıtı oluşturur.
-
DeveloperExceptionPageMiddleware: İstek HTTP üst bilgisi içermediğinde
Accepttext/htmlgeliştirme aşamasında bir sorun ayrıntıları yanıtı oluşturur.
Uzantı yöntemi kullanılarak tüm HTTP istemci ve sunucu hata yanıtları için sorun ayrıntıları yanıtı oluşturmak üzere en az API uygulamaları yapılandırılabilir.
Aşağıdaki kod, uygulamayı sorun ayrıntıları oluşturacak şekilde yapılandırıyor:
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);
kullanma AddProblemDetailshakkında daha fazla bilgi için bkz . Sorun Ayrıntıları
IProblemDetailsService geri dönüşü
Aşağıdaki kodda, httpContext.Response.WriteAsync("Fallback: An error occurred.") uygulama bir oluşturamıyorsa IProblemDetailsService bir ProblemDetailshata döndürür:
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();
Önceki kod:
- bir yazamıyorsa
problemDetailsServicegeri dönüş koduyla birProblemDetailshata iletisi yazar. Örneğin, Accept isteği üst bilgisinin desteklemediği bir medya türüDefaulProblemDetailsWriterbelirttiği bir uç nokta. - Özel Durum İşleyici ara yazılımını kullanır.
Aşağıdaki örnek, öğesini çağırması dışında öncekine Status Code Pages middlewarebenzer.
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);
Ek hata işleme özellikleri
Denetleyicilerden En Düşük API'lere geçiş
Denetleyici tabanlı API'lerden En Düşük API'lere geçiş gerçekleştiriyorsanız:
- Eylem filtrelerini uç nokta filtreleri veya ara yazılımla değiştirme
- Model doğrulamayı el ile doğrulama veya özel bağlama ile değiştirme
- Özel durum filtrelerini özel durum işleme ara yazılımıyla değiştirme
- Tutarlı hata yanıtları için kullanarak
AddProblemDetails()
Denetleyici tabanlı hata işleme ne zaman kullanılır?
Aşağıdakilere ihtiyacınız varsa denetleyici tabanlı API'leri göz önünde bulundurun:
- Karmaşık model doğrulama senaryoları
- Birden çok denetleyici arasında merkezi özel durum işleme
- Hata yanıtı biçimlendirmesi üzerinde ayrıntılı denetim
- Filtreler ve kurallar gibi MVC özellikleriyle tümleştirme
Doğrulama hataları, sorun ayrıntıları özelleştirmesi ve özel durum filtreleri de dahil olmak üzere denetleyici tabanlı hata işleme hakkında ayrıntılı bilgi için Denetleyiciler sekmesi bölümlerine bakın.
Ek kaynaklar
ASP.NET Core