ASP.NET Core hataları işleme
Kirk Larkabağı, Tom Dykstrave Steve Smith tarafından
bu makalede ASP.NET Core web apps 'teki hataları işlemeye yönelik yaygın yaklaşımlar ele alınmaktadır. Bkz Web API'ASP.NET Core hataları işleme . Web API 'leri için.
Örnek kodu görüntüleyin veya indirin. (Nasıl indirilir.) F12 tarayıcı geliştirici araçlarındaki ağ sekmesi, örnek uygulamayı test ederken faydalıdır.
Geliştirici özel durum sayfası
Geliştirici özel durum sayfası işlenmemiş istek özel durumları hakkında ayrıntılı bilgi görüntüler. ASP.NET Core şablonları aşağıdaki kodu oluşturur:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
Yukarıdaki vurgulanmış kod, uygulama geliştirme ortamındaçalışırken geliştirici özel durum sayfasını sunar.
Şablonlar, UseDeveloperExceptionPage izleyen ara yazılım tarafından oluşturulan işlenmemiş özel durumları yakalayabilmesi için, ara yazılım ardışık düzenine erken yerleştirir.
Yukarıdaki kod, geliştirici özel durum sayfasını yalnızca uygulama geliştirme ortamında çalıştırıldığında etkinleştirilir. Ayrıntılı özel durum bilgileri, uygulama üretim ortamında çalıştırıldığında herkese açık bir şekilde gösterilmemelidir. Ortamları yapılandırma hakkında daha fazla bilgi için bkz ASP.NET Core'da birden çok ortam kullanma ..
Geliştirici özel durum sayfasında özel durum ve istek hakkında aşağıdaki bilgiler yer alabilir:
- Yığın izleme
- Varsa sorgu dizesi parametreleri
- Cookievarsa s
- Üst Bilgiler
Geliştirici özel durum sayfasının herhangi bir bilgi sağlaması garanti edilmez. Tüm hata bilgileri için günlüğe kaydetmeyi kullanın.
Özel durum işleyici sayfası
Üretim ortamıiçin özel bir hata işleme sayfası yapılandırmak için çağrısı yapın UseExceptionHandler . Bu özel durum işleme ara yazılımı:
- İşlenmemiş özel durumları yakalar ve günlüğe kaydeder.
- Belirtilen yolu kullanarak isteği alternatif bir ardışık düzende yeniden yürütür. Yanıt başlatılmışsa istek yeniden yürütülmez. Şablon tarafından oluşturulan kod, yolu kullanarak isteği yeniden yürütür
/Error.
Uyarı
Alternatif Işlem hattı kendi özel durumunu oluşturursa, özel durum Işleme ara yazılımı özgün özel durumu yeniden oluşturur.
Aşağıdaki örnekte, UseExceptionHandler özel durum işleme ara yazılımını geliştirme olmayan ortamlara ekler:
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
RazorSayfalar uygulama şablonu, sayfalar klasöründe bir hata sayfası ( .cshtml ) ve PageModel Sınıf ( ErrorModel ) sağlar . MVC uygulaması için proje şablonu, Error Denetleyici için bir eylem yöntemi ve bir hata görünümü içerir Home .
Özel durum işleme ara yazılımı, özgün http yöntemini kullanarak isteği yeniden yürütür. Bir hata işleyicisi uç noktası belirli bir HTTP yöntemleri kümesiyle sınırlı ise, yalnızca bu HTTP yöntemleri için çalışır. Örneğin, özniteliğini kullanan bir MVC denetleyici eylemi [HttpGet] yalnızca get istekleri için çalışır. Tüm isteklerin özel hata işleme sayfasına ulaşmasını sağlamak için bunları belırlı bir http yöntemleri kümesiyle kısıtlamayın.
Özgün HTTP yöntemine göre özel durumları farklı şekilde işlemek için:
- RazorSayfalar için birden çok işleyici yöntemi oluşturun. Örneğin, özel durum
OnGetAl işlemini idare etmek veOnPostözel durumları işlemek için kullanmak üzere kullanın. - MVC için, HTTP fiili özniteliklerini birden çok eyleme uygulayın. Örneğin, özel durum
[HttpGet]Al işlemini idare etmek ve[HttpPost]özel durumları işlemek için kullanmak üzere kullanın.
Kimliği doğrulanmamış kullanıcıların özel hata işleme sayfasını görüntülemesine izin vermek için, anonim erişimi desteklediğinden emin olun.
Özel duruma erişin
IExceptionHandlerPathFeatureBir hata işleyicisindeki özel duruma ve özgün istek yoluna erişmek için kullanın. aşağıdaki kod, ExceptionMessage ASP.NET Core şablonları tarafından oluşturulan varsayılan sayfalara/hata. cshtml. cs öğesine ekler:
[ResponseCache(Duration=0, Location=ResponseCacheLocation.None, NoStore=true)]
[IgnoreAntiforgeryToken]
public class ErrorModel : PageModel
{
public string RequestId { get; set; }
public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
public string ExceptionMessage { get; set; }
private readonly ILogger<ErrorModel> _logger;
public ErrorModel(ILogger<ErrorModel> logger)
{
_logger = logger;
}
public void OnGet()
{
RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;
var exceptionHandlerPathFeature =
HttpContext.Features.Get<IExceptionHandlerPathFeature>();
if (exceptionHandlerPathFeature?.Error is FileNotFoundException)
{
ExceptionMessage = "File error thrown";
_logger.LogError(ExceptionMessage);
}
if (exceptionHandlerPathFeature?.Path == "/index")
{
ExceptionMessage += " from home page";
}
}
}
Uyarı
İstemcilere hassas hata bilgileri sunma. Hatalara hizmet vermek bir güvenlik riskidir.
Örnek uygulamadakiözel durumu sınamak için:
- Ortamı üretime ayarlayın.
- İçindeki açıklamaları kaldırın
webBuilder.UseStartup<Startup>();Program.cs. - Giriş sayfasında özel durum tetikleme ' yı seçin.
Özel durum işleyici lambda
Özel bir özel durum işleyici sayfasına bir alternatif, için bir lambda sağlamaktır UseExceptionHandler . Lambda kullanılması, yanıtı döndürmeden önce hataya erişim sağlar.
Aşağıdaki kod, özel durum işleme için bir lambda kullanır:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler(errorApp =>
{
errorApp.Run(async context =>
{
context.Response.StatusCode = (int) HttpStatusCode.InternalServerError;;
context.Response.ContentType = "text/html";
await context.Response.WriteAsync("<html lang=\"en\"><body>\r\n");
await context.Response.WriteAsync("ERROR!<br><br>\r\n");
var exceptionHandlerPathFeature =
context.Features.Get<IExceptionHandlerPathFeature>();
if (exceptionHandlerPathFeature?.Error is FileNotFoundException)
{
await context.Response.WriteAsync(
"File error thrown!<br><br>\r\n");
}
await context.Response.WriteAsync(
"<a href=\"/\">Home</a><br>\r\n");
await context.Response.WriteAsync("</body></html>\r\n");
await context.Response.WriteAsync(new string(' ', 512));
});
});
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
Uyarı
Ya da istemcilerinden önemli hata bilgileri sunma IExceptionHandlerFeature IExceptionHandlerPathFeature . Hatalara hizmet vermek bir güvenlik riskidir.
Örnek uygulamadalambda işlemesini test etmek için:
- Ortamı üretime ayarlayın.
- İçindeki açıklamaları kaldırın
webBuilder.UseStartup<StartupLambda>();Program.cs. - Giriş sayfasında özel durum tetikleme ' yı seçin.
UseStatusCodePages
varsayılan olarak, bir ASP.NET Core uygulama HTTP hata durum kodları için 404-bulunamadı gibi bir durum kodu sayfası sağlamaz. Uygulama, gövdesi olmayan bir HTTP 400-599 hata durum kodu ile karşılaştığında, durum kodunu ve boş bir yanıt gövdesini döndürür. Durum kodu sayfaları sağlamak için durum kodu sayfaları ara yazılımını kullanın. Ortak hata durum kodları için varsayılan salt metin işleyicilerini etkinleştirmek üzere UseStatusCodePages Startup.Configure yöntemi çağırın:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseStatusCodePages();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
UseStatusCodePagesİstek işleme ara yazılımı için çağrı yapın. Örneğin, UseStatusCodePages statik dosya ara yazılımı ve uç nokta ara yazılımı aracılığıyla çağrı yapın.
UseStatusCodePagesKullanılmazsa, uç nokta olmadan BIR URL 'ye gitmek, uç noktanın bulunamadığını belirten tarayıcıya bağlı bir hata iletisi döndürür. Örneğin, sayfasına gitme Home/Privacy2 . UseStatusCodePagesÇağrıldığında tarayıcı şunu döndürür:
Status Code: 404; Not Found
UseStatusCodePages Genellikle üretimde kullanılmaz çünkü kullanıcılara faydalı olmayan bir ileti döndürür.
UseStatusCodePages Örnek uygulamadatest etmek için:
- Ortamı üretime ayarlayın.
- İçindeki açıklamaları kaldırın
webBuilder.UseStartup<StartupUseStatusCodePages>();Program.cs. - Giriş sayfasındaki giriş sayfasında bulunan bağlantıları seçin.
Not
Durum kodu sayfaları ara yazılımı özel durumları yakalamaz . Özel bir hata işleme sayfası sağlamak için özel durum işleyicisi sayfasınıkullanın.
Biçim dizesiyle UseStatusCodePages
Yanıt içerik türünü ve metnini özelleştirmek için, öğesinin UseStatusCodePages bir içerik türü ve biçim dizesi alan aşırı yüklemesini kullanın:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseStatusCodePages(
"text/plain", "Status code page, status code: {0}");
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
Yukarıdaki kodda, {0} hata kodu için bir yer tutucudur.
UseStatusCodePages bir biçim dizesi, genellikle üretimde kullanılmıyor çünkü kullanıcılara faydalı olmayan bir ileti döndürüyor.
UseStatusCodePages Örnek uygulamadatest etmek için içindeki açıklamaları kaldırın webBuilder.UseStartup<StartupFormat>(); Program.cs .
Lambda ile UseStatusCodePages
Özel hata işleme ve yanıt yazma kodu belirtmek için, UseStatusCodePages bir lambda ifadesi alan aşırı yüklemesini kullanın:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseStatusCodePages(async context =>
{
context.HttpContext.Response.ContentType = "text/plain";
await context.HttpContext.Response.WriteAsync(
"Status code page, status code: " +
context.HttpContext.Response.StatusCode);
});
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
UseStatusCodePages Lambda ile, kullanıcılar için faydalı olmayan bir ileti döndürdüğünden, genellikle üretimde kullanılmaz.
UseStatusCodePages Örnek uygulamadatest etmek için içindeki açıklamaları kaldırın webBuilder.UseStartup<StartupStatusLambda>(); Program.cs .
Usestatuscodepageswithyönlendirmeler
UseStatusCodePagesWithRedirectsUzantı yöntemi:
- İstemciye 302 tarafından bulunan bir durum kodu gönderir.
- İstemciyi, URL şablonunda belirtilen hata işleme uç noktasına yönlendirir. Hata işleme uç noktası genellikle hata bilgilerini görüntüler ve HTTP 200 döndürür.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseStatusCodePagesWithRedirects("/MyStatusCode?code={0}");
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
URL şablonu, {0} Önceki kodda gösterildiği gibi durum kodu için bir yer tutucu içerebilir. URL şablonu ~ (tilde) ile başlıyorsa, ~ uygulamanın tarafından değiştirilmiştir PathBase . Uygulamada bir uç nokta belirtirken, uç nokta için bir MVC görünümü veya Razor sayfası oluşturun. Bir Razor Sayfalar örneği için bkz. Sample App'Teki Pages/mystatuscode. cshtml .
Bu yöntem genellikle uygulama şu şekilde kullanılır:
- , Genellikle farklı bir uygulamanın hatayı işlediği durumlarda istemciyi farklı bir uç noktaya yönlendirmelidir. Web Apps için, istemcinin tarayıcı adres çubuğu yeniden yönlendirilen uç noktayı yansıtır.
- İlk yeniden yönlendirme yanıtıyla birlikte özgün durum kodunu korumamalıdır ve döndürmemelidir.
UseStatusCodePages Örnek uygulamadatest etmek için içindeki açıklamaları kaldırın webBuilder.UseStartup<StartupSCredirect>(); Program.cs .
UseStatusCodePagesWithReExecute
UseStatusCodePagesWithReExecuteUzantı yöntemi:
- İstemciye özgün durum kodunu döndürür.
- Alternatif bir yol kullanarak istek ardışık düzenini yeniden yürüterek yanıt gövdesini oluşturur.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseStatusCodePagesWithReExecute("/MyStatusCode2", "?code={0}");
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
Uygulama içindeki bir uç nokta belirtilmişse, uç nokta için bir MVC görünümü veya Razor sayfası oluşturun. UseStatusCodePagesWithReExecute UseRouting İsteğin durum sayfasına tekrar yönlendirilmemesi için önce bulunduğundan emin olun. Bir Razor Sayfalar örneği için örnek uygulamadaki Pages/MyStatusCode2. cshtml bölümüne bakın.
Bu yöntem genellikle uygulama şunları yaparken kullanılır:
- Farklı bir uç noktaya yönlendirmeye gerek kalmadan isteği işleyin. Web Apps için, istemcinin tarayıcı adres çubuğu, ilk olarak istenen uç noktayı yansıtır.
- Yanıt ile orijinal durum kodunu koruyun ve geri döndürün.
URL ve sorgu dizesi şablonları, durum kodu için bir yer tutucu içerebilir {0} . URL şablonu ile başlamalıdır / .
Hatayı işleyen uç nokta, aşağıdaki örnekte gösterildiği gibi, hatayı oluşturan özgün URL 'YI alabilir:
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public class MyStatusCode2Model : PageModel
{
public string RequestId { get; set; }
public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
public string ErrorStatusCode { get; set; }
public string OriginalURL { get; set; }
public bool ShowOriginalURL => !string.IsNullOrEmpty(OriginalURL);
public void OnGet(string code)
{
RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;
ErrorStatusCode = code;
var statusCodeReExecuteFeature = HttpContext.Features.Get<
IStatusCodeReExecuteFeature>();
if (statusCodeReExecuteFeature != null)
{
OriginalURL =
statusCodeReExecuteFeature.OriginalPathBase
+ statusCodeReExecuteFeature.OriginalPath
+ statusCodeReExecuteFeature.OriginalQueryString;
}
}
}
Bir Razor Sayfalar örneği için örnek uygulamadaki Pages/MyStatusCode2. cshtml bölümüne bakın.
UseStatusCodePages Örnek uygulamadatest etmek için içindeki açıklamaları kaldırın webBuilder.UseStartup<StartupSCreX>(); Program.cs .
Durum kodu sayfalarını devre dışı bırak
MVC denetleyicisi veya eylem yöntemi için durum kodu sayfalarını devre dışı bırakmak için [Skipstatuscodepages] özniteliğini kullanın.
Bir Razor sayfa işleyici yöntemindeki veya BIR MVC denetleyicisindeki belirli istekler için durum kodu sayfalarını devre dışı bırakmak için şunu kullanın IStatusCodePagesFeature :
public void OnGet()
{
// using Microsoft.AspNetCore.Diagnostics;
var statusCodePagesFeature = HttpContext.Features.Get<IStatusCodePagesFeature>();
if (statusCodePagesFeature != null)
{
statusCodePagesFeature.Enabled = false;
}
}
Özel durum işleme kodu
Özel durum işleme sayfalarındaki kod de özel durumlar oluşturabilir. Üretim hatası sayfaları tamamen test edilmelidir ve kendi özel durumlarını oluşturmaktan kaçınmak için ek bir işlem gerçekleştirir.
Yanıt üst bilgileri
Yanıt üstbilgileri gönderildikten sonra:
- Uygulama, yanıtın durum kodunu değiştiremiyor.
- Tüm özel durum sayfaları veya işleyicileri çalıştırılamaz. Yanıt tamamlanmalıdır veya bağlantı iptal edilmiş olmalıdır.
Sunucu özel durum işleme
Bir uygulamadaki özel durum işleme mantığına ek olarak, http sunucusu uygulaması bazı özel durumları işleyebilir. Yanıt üst bilgileri gönderilmeden sunucu bir özel durumu yakalarsa, sunucu yanıt 500 - Internal Server Error gövdesi olmadan bir yanıt gönderir. Yanıt üstbilgileri gönderildikten sonra sunucu bir özel durum yakalar, sunucu bağlantıyı kapatır. Uygulama tarafından işlenmeyen istekler sunucu tarafından işlenir. Sunucu isteği gerçekleştirirken oluşan tüm özel durumlar sunucunun özel durum işleme tarafından işlenir. Uygulamanın özel hata sayfaları, özel durum işleme ara yazılımı ve filtreler bu davranışı etkilemez.
Başlatma özel durum işleme
Uygulama başlangıcında gerçekleşen özel durumları yalnızca barındırma katmanı işleyebilir. Konak, Başlangıç hatalarını yakalamak ve ayrıntılı hataları yakalamakiçin yapılandırılabilir.
Barındırma katmanı, yalnızca hatanın ana bilgisayar adresi/bağlantı noktası bağlamalarından sonra oluşması durumunda yakalanan başlatma hatası için bir hata sayfası gösterebilir. Bağlama başarısız olursa:
- Barındırma katmanı, kritik bir özel durumu günlüğe kaydeder.
- DotNet işlemi kilitleniyor.
- HTTP sunucusu olduğunda hata sayfası gösterilmez Kestrel .
ııs 'de (veya Azure App Service) veya IIS Expressçalışırken, işlem başlatılamazsa ASP.NET Core modülü tarafından 502,5 işlem hatası döndürülür. Daha fazla bilgi için bkz. Azure App Service IIS ASP.NET Core de ASP.NET Core sorunlarını giderme.
Veritabanı hata sayfası
Veritabanı Geliştirici sayfası özel durum filtresi, AddDatabaseDeveloperPageExceptionFilter Entity Framework Core geçişleri kullanılarak çözümlenebilirler veritabanıyla ilgili özel durumları yakalar. Bu özel durumlar oluştuğunda, sorunu çözmek için olası eylemlerin ayrıntıları ile bir HTML yanıtı üretilir. Bu sayfa yalnızca geliştirme ortamında etkinleştirilmiştir. aşağıdaki kod, Razor bireysel kullanıcı hesapları belirtildiğinde ASP.NET Core Pages şablonları tarafından oluşturulmuştur:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDatabaseDeveloperPageExceptionFilter();
services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddRazorPages();
}
Özel durum filtreleri
MVC uygulamalarında özel durum filtreleri, genel olarak veya denetleyicide veya eylem temelinde yapılandırılabilir. RazorSayfalar uygulamalarda, genel olarak veya sayfa modeli başına yapılandırılabilirler. Bu filtreler, bir denetleyici eyleminin ya da başka bir filtrenin yürütülmesi sırasında oluşan işlenmemiş özel durumları işler. Daha fazla bilgi için bkz. ASP.NET Core filtreler.
Özel durum filtreleri, MVC eylemleri içinde oluşan özel durumları yakalamak için faydalıdır, ancak yerleşik özel durum işleme ara yazılımıolarak esnek değildir UseExceptionHandler . UseExceptionHandlerHANGI MVC eyleminin seçilmesinden farklı olarak hata işleme yapmanız gerekmediği müddetçe kullanmanızı öneririz.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
Model durumu hataları
Model durumu hatalarını işleme hakkında daha fazla bilgi için bkz. model bağlama ve model doğrulaması.
Ek kaynaklar
Tom Dykstrave Steve Smith tarafından
bu makalede ASP.NET Core web apps 'teki hataları işlemeye yönelik yaygın yaklaşımlar ele alınmaktadır. Bkz Web API'ASP.NET Core hataları işleme . Web API 'leri için.
Örnek kodu görüntüleyin veya indirin. (Nasıl indirilir.)
Geliştirici özel durum sayfası
Geliştirici özel durum sayfası , istek özel durumları hakkında ayrıntılı bilgileri görüntüler. ASP.NET Core şablonları aşağıdaki kodu oluşturur:
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
Yukarıdaki kod, uygulama geliştirme ortamındaçalışırken geliştirici özel durum sayfasını sunar.
Şablonlar, UseDeveloperExceptionPage izleyen ara yazılım içinde özel durumların yakalanabilmesi için herhangi bir ara yazılımın önüne yerleştirir.
Yukarıdaki kod, geliştirici özel durum sayfasını yalnızca uygulama geliştirme ortamında çalışırken sunar. Ayrıntılı özel durum bilgileri, uygulama üretimde çalıştırıldığında herkese açık bir şekilde gösterilmemelidir. Ortamları yapılandırma hakkında daha fazla bilgi için bkz ASP.NET Core'da birden çok ortam kullanma ..
Geliştirici özel durum sayfası, özel durum ve istek hakkında şu bilgileri içerir:
- Yığın izleme
- Varsa sorgu dizesi parametreleri
- Cookievarsa s
- Üst Bilgiler
Özel durum işleyici sayfası
Üretim ortamı için özel bir hata işleme sayfası yapılandırmak için özel durum Işleme ara yazılımını kullanın. Ara yazılım:
- Özel durumları yakalar ve günlüğe kaydeder.
- İsteği, belirtilen sayfa veya denetleyici için alternatif bir ardışık düzende yeniden yürütür. Yanıt başlatılmışsa istek yeniden yürütülmez. Oluşturulan şablon kodu, isteği yeniden yürütür
/Error.
Aşağıdaki örnekte, UseExceptionHandler özel durum Işleme ara yazılımını geliştirme olmayan ortamlara ekler:
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
RazorSayfalar uygulama şablonu, sayfalar klasöründe bir hata sayfası ( .cshtml ) ve PageModel Sınıf ( ErrorModel ) sağlar . MVC uygulaması için proje şablonu, denetleyicide bir hata eylemi yöntemi ve bir hata görünümü içerir Home .
Hata işleyicisi eylem yöntemini, gibi HTTP yöntemi öznitelikleriyle işaretlemeyin HttpGet . Açık fiiller bazı isteklerin yönteme ulaşmasını önler. Kimliği doğrulanmamış kullanıcılar hata görünümünü görüyse, metoda anonim erişime izin verin.
Özel duruma erişin
IExceptionHandlerPathFeatureHata işleyicisi denetleyicisi veya sayfasındaki özel duruma ve özgün istek yoluna erişmek için kullanın:
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public class ErrorModel : PageModel
{
public string RequestId { get; set; }
public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
public string ExceptionMessage { get; set; }
public void OnGet()
{
RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;
var exceptionHandlerPathFeature =
HttpContext.Features.Get<IExceptionHandlerPathFeature>();
if (exceptionHandlerPathFeature?.Error is FileNotFoundException)
{
ExceptionMessage = "File error thrown";
}
if (exceptionHandlerPathFeature?.Path == "/index")
{
ExceptionMessage += " from home page";
}
}
}
Uyarı
İstemcilere hassas hata bilgileri sunma. Hatalara hizmet vermek bir güvenlik riskidir.
Önceki özel durum işleme sayfasını tetiklemek için ortamı üretimler olarak ayarlayın ve bir özel durum zorlayın.
Özel durum işleyici lambda
Özel bir özel durum işleyici sayfasına bir alternatif, için bir lambda sağlamaktır UseExceptionHandler . Lambda kullanılması, yanıtı döndürmeden önce hataya erişim sağlar.
Özel durum işleme için lambda kullanmanın bir örneği aşağıda verilmiştir:
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler(errorApp =>
{
errorApp.Run(async context =>
{
context.Response.StatusCode = (int) HttpStatusCode.InternalServerError;
context.Response.ContentType = "text/html";
await context.Response.WriteAsync("<html lang=\"en\"><body>\r\n");
await context.Response.WriteAsync("ERROR!<br><br>\r\n");
var exceptionHandlerPathFeature =
context.Features.Get<IExceptionHandlerPathFeature>();
if (exceptionHandlerPathFeature?.Error is FileNotFoundException)
{
await context.Response.WriteAsync("File error thrown!<br><br>\r\n");
}
await context.Response.WriteAsync("<a href=\"/\">Home</a><br>\r\n");
await context.Response.WriteAsync("</body></html>\r\n");
await context.Response.WriteAsync(new string(' ', 512)); // IE padding
});
});
app.UseHsts();
}
Yukarıdaki kodda, await context.Response.WriteAsync(new string(' ', 512)); Internet Explorer tarayıcısı BIR IE hata iletisi yerine hata iletisini görüntüleyecek şekilde eklenmiştir. daha fazla bilgi için bu GitHub sorunabakın.
Uyarı
Ya da istemcilerinden önemli hata bilgileri sunma IExceptionHandlerFeature IExceptionHandlerPathFeature . Hatalara hizmet vermek bir güvenlik riskidir.
Örnek uygulamadalambda işlemenin özel durum işleme sonucunu görmek için, ProdEnvironment ve ön ErrorHandlerLambda işlemci yönergelerini kullanın ve giriş sayfasında özel durum Tetikle ' yi seçin.
UseStatusCodePages
varsayılan olarak, bir ASP.NET Core uygulama HTTP durum kodları için 404-bulunamadı gibi bir durum kodu sayfası sağlamaz. Uygulama bir durum kodu ve boş bir yanıt gövdesi döndürür. Durum kodu sayfaları sağlamak için durum kodu sayfaları ara yazılımını kullanın.
Ara yazılım Microsoft. AspNetCore. Diagnostics paketi tarafından kullanılabilir hale getirilir.
Ortak hata durum kodları için varsayılan salt metin işleyicilerini etkinleştirmek üzere UseStatusCodePages Startup.Configure yöntemi çağırın:
app.UseStatusCodePages();
UseStatusCodePagesİstek işleme ara yazılımı (örneğin, statik dosya ara yazılımı ve MVC ara yazılımı) önce çağırın.
UseStatusCodePagesKullanılmazsa, uç nokta olmadan BIR URL 'ye gitmek, uç noktanın bulunamadığını belirten tarayıcıya bağlı bir hata iletisi döndürür. Örneğin, sayfasına gitme Home/Privacy2 . UseStatusCodePagesÇağrıldığında tarayıcı şunu döndürür:
Status Code: 404; Not Found
Biçim dizesiyle UseStatusCodePages
Yanıt içerik türünü ve metnini özelleştirmek için, öğesinin UseStatusCodePages bir içerik türü ve biçim dizesi alan aşırı yüklemesini kullanın:
app.UseStatusCodePages(
"text/plain", "Status code page, status code: {0}");
Lambda ile UseStatusCodePages
Özel hata işleme ve yanıt yazma kodu belirtmek için, UseStatusCodePages bir lambda ifadesi alan aşırı yüklemesini kullanın:
app.UseStatusCodePages(async context =>
{
context.HttpContext.Response.ContentType = "text/plain";
await context.HttpContext.Response.WriteAsync(
"Status code page, status code: " +
context.HttpContext.Response.StatusCode);
});
Usestatuscodepageswithyönlendirmeler
UseStatusCodePagesWithRedirectsUzantı yöntemi:
- İstemciye 302 tarafından bulunan bir durum kodu gönderir.
- İstemciyi, URL şablonunda belirtilen konuma yönlendirir.
app.UseStatusCodePagesWithRedirects("/StatusCode?code={0}");
URL şablonu, {0} örnekte gösterildiği gibi durum kodu için bir yer tutucu içerebilir. URL şablonu ~ (tilde) ile başlıyorsa, ~ uygulamanın tarafından değiştirilmiştir PathBase . Uygulamanın içindeki bir uç noktayı işaret ederseniz, uç nokta için bir MVC görünümü veya Razor sayfası oluşturun. Bir Razor Sayfalar örneği için örnek uygulamadaki Pages/StatusCode. cshtml bölümüne bakın.
Bu yöntem genellikle uygulama şu şekilde kullanılır:
- , Genellikle farklı bir uygulamanın hatayı işlediği durumlarda istemciyi farklı bir uç noktaya yönlendirmelidir. Web Apps için, istemcinin tarayıcı adres çubuğu yeniden yönlendirilen uç noktayı yansıtır.
- İlk yeniden yönlendirme yanıtıyla birlikte özgün durum kodunu korumamalıdır ve döndürmemelidir.
UseStatusCodePagesWithReExecute
UseStatusCodePagesWithReExecuteUzantı yöntemi:
- İstemciye özgün durum kodunu döndürür.
- Alternatif bir yol kullanarak istek ardışık düzenini yeniden yürüterek yanıt gövdesini oluşturur.
app.UseStatusCodePagesWithReExecute("/StatusCode","?code={0}");
Uygulamanın içindeki bir uç noktayı işaret ederseniz, uç nokta için bir MVC görünümü veya Razor sayfası oluşturun. UseStatusCodePagesWithReExecute UseRouting İsteğin durum sayfasına tekrar yönlendirilmemesi için önce bulunduğundan emin olun. Bir Razor Sayfalar örneği için örnek uygulamadaki Pages/StatusCode. cshtml bölümüne bakın.
Bu yöntem genellikle uygulama şunları yaparken kullanılır:
- Farklı bir uç noktaya yönlendirmeye gerek kalmadan isteği işleyin. Web Apps için, istemcinin tarayıcı adres çubuğu, ilk olarak istenen uç noktayı yansıtır.
- Yanıt ile orijinal durum kodunu koruyun ve geri döndürün.
URL ve sorgu dizesi şablonları durum kodu için bir yer tutucu ( {0} ) içerebilir. URL şablonu eğik çizgiyle ( / ) başlamalıdır. Yolda bir yer tutucu kullanırken, uç noktanın (sayfa veya denetleyicinin) yol kesimini işleyediğini doğrulayın. Örneğin, bir Razor sayfa, yönergeyle isteğe bağlı yol segmenti değerini kabul etmelidir @page :
@page "{code?}"
Hatayı işleyen uç nokta, aşağıdaki örnekte gösterildiği gibi, hatayı oluşturan özgün URL 'YI alabilir:
var statusCodeReExecuteFeature = HttpContext.Features.Get<IStatusCodeReExecuteFeature>();
if (statusCodeReExecuteFeature != null)
{
OriginalURL =
statusCodeReExecuteFeature.OriginalPathBase
+ statusCodeReExecuteFeature.OriginalPath
+ statusCodeReExecuteFeature.OriginalQueryString;
}
Hata işleyicisi eylem yöntemini, gibi HTTP yöntemi öznitelikleriyle işaretlemeyin HttpGet . Açık fiiller bazı isteklerin yönteme ulaşmasını önler. Kimliği doğrulanmamış kullanıcılar hata görünümünü görüyse, metoda anonim erişime izin verin.
Durum kodu sayfalarını devre dışı bırak
MVC denetleyicisi veya eylem yöntemi için durum kodu sayfalarını devre dışı bırakmak için özniteliğini kullanın [SkipStatusCodePages] .
Bir Razor sayfa işleyici yöntemindeki veya BIR MVC denetleyicisindeki belirli istekler için durum kodu sayfalarını devre dışı bırakmak için şunu kullanın IStatusCodePagesFeature :
var statusCodePagesFeature = HttpContext.Features.Get<IStatusCodePagesFeature>();
if (statusCodePagesFeature != null)
{
statusCodePagesFeature.Enabled = false;
}
Özel durum işleme kodu
Özel durum işleme sayfalarındaki kod özel durumlar oluşturabilir. Üretim hatası sayfalarının tamamen statik içerikten oluşması genellikle iyi bir fikirdir.
Yanıt üst bilgileri
Yanıt üstbilgileri gönderildikten sonra:
- Uygulama, yanıtın durum kodunu değiştiremiyor.
- Tüm özel durum sayfaları veya işleyicileri çalıştırılamaz. Yanıt tamamlanmalıdır veya bağlantı iptal edilmiş olmalıdır.
Sunucu özel durum işleme
Uygulamanızın özel durum işleme mantığına ek olarak, http sunucusu uygulaması bazı özel durumları işleyebilir. Sunucu yanıt üstbilgileri gönderilmeden önce bir özel durum yakalarsa, sunucu yanıt gövdesi olmadan 500-Iç sunucu hatası yanıtı gönderir. Yanıt üstbilgileri gönderildikten sonra sunucu bir özel durum yakalar, sunucu bağlantıyı kapatır. Uygulamanız tarafından işlenmeyen istekler sunucu tarafından işlenir. Sunucu isteği gerçekleştirirken oluşan tüm özel durumlar sunucunun özel durum işleme tarafından işlenir. Uygulamanın özel hata sayfaları, özel durum işleme ara yazılımı ve filtreler bu davranışı etkilemez.
Başlatma özel durum işleme
Uygulama başlangıcında gerçekleşen özel durumları yalnızca barındırma katmanı işleyebilir. Konak, Başlangıç hatalarını yakalamak ve ayrıntılı hataları yakalamakiçin yapılandırılabilir.
Barındırma katmanı, yalnızca hatanın ana bilgisayar adresi/bağlantı noktası bağlamalarından sonra oluşması durumunda yakalanan başlatma hatası için bir hata sayfası gösterebilir. Bağlama başarısız olursa:
- Barındırma katmanı, kritik bir özel durumu günlüğe kaydeder.
- DotNet işlemi kilitleniyor.
- HTTP sunucusu olduğunda hata sayfası gösterilmez Kestrel .
ııs 'de (veya Azure App Service) veya IIS Expressçalışırken, işlem başlatılamazsa ASP.NET Core modülü tarafından 502,5 işlem hatası döndürülür. Daha fazla bilgi için bkz. Azure App Service IIS ASP.NET Core de ASP.NET Core sorunlarını giderme.
Veritabanı hata sayfası
Veritabanı hata sayfası ara yazılımı, Entity Framework geçişleri kullanılarak çözümleneyolabilecek veritabanıyla ilgili özel durumları yakalar. Bu özel durumlar gerçekleştiğinde, sorunu çözmeye yönelik olası eylemlerin ayrıntılarını içeren bir HTML yanıtı oluşturulur. Bu sayfa yalnızca geliştirme ortamında etkinleştirilmelidir. Aşağıdakileri kod ekleyerek sayfayı etkinleştirin Startup.Configure :
if (env.IsDevelopment())
{
app.UseDatabaseErrorPage();
}
UseDatabaseErrorPageMicrosoft. aspnetcore. Diagnostics. entityframeworkcore NuGet paketini gerektirir.
Özel durum filtreleri
MVC uygulamalarında özel durum filtreleri, genel olarak veya denetleyicide veya eylem temelinde yapılandırılabilir. RazorSayfalar uygulamalarda, genel olarak veya sayfa modeli başına yapılandırılabilirler. Bu filtreler, bir denetleyici eyleminin veya başka bir filtrenin yürütülmesi sırasında oluşan işlenmemiş özel durumları işler. Daha fazla bilgi için bkz. ASP.NET Core filtreler.
İpucu
Özel durum filtreleri, MVC eylemleri içinde oluşan özel durumları yakalamak için yararlıdır, ancak özel durum Işleme ara yazılımı kadar esnek değildir. Ara yazılımı kullanmanızı öneririz. Yalnızca hangi MVC eyleminin seçilmesinden ayrı olarak hata işleme yapmanız gereken durumlarda filtreleri kullanın.
Model durumu hataları
Model durumu hatalarını işleme hakkında daha fazla bilgi için bkz. model bağlama ve model doğrulaması.