Zpracování chyb v ASP.NET Core
Kirka Larkin, Dykstraa Steve Smith
tento článek se věnuje běžným přístupům ke zpracování chyb v ASP.NET Core web apps. Podívejte se Zpracování chyb ve ASP.NET Core rozhraní API na webová rozhraní API.
Zobrazit nebo stáhnout vzorový kód. (Stažení.) Karta síť v nástrojích pro vývojáře v prohlížeči F12 je užitečná při testování ukázkové aplikace.
Stránka s výjimkou pro vývojáře
Stránka s výjimkou vývojáře zobrazuje podrobné informace o neošetřených výjimkách žádostí. šablony ASP.NET Core generují následující kód:
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();
});
}
Předchozí zvýrazněný kód povoluje stránku s výjimkou vývojářů, když aplikace běží ve vývojovém prostředí.
Šablony jsou na UseDeveloperExceptionPage začátku v kanálu middlewaru, aby mohli zachytit neošetřené výjimky, které jsou vyvolány v middlewaru, který následuje.
Předchozí kód povoluje stránku výjimky vývojářů pouze v případě, že aplikace běží ve vývojovém prostředí. Podrobné informace o výjimce by se neměly veřejně zobrazovat, pokud je aplikace spuštěná v produkčním prostředí. Další informace o konfiguraci prostředí najdete v tématu Používání více prostředí v ASP.NET Core .
Stránka s výjimkou vývojářů může obsahovat následující informace o výjimce a žádosti:
- Trasování zásobníku
- Parametry řetězce dotazu, pokud existují
- Cookies if
- Hlavičky
Na stránce s výjimkou vývojáře není zaručeno poskytovat žádné informace. Pro úplné informace o chybách použijte protokolování .
Stránka obslužné rutiny výjimek
Chcete-li nakonfigurovat vlastní stránku zpracování chyb pro produkční prostředí, zavolejte UseExceptionHandler . Tato výjimka zpracovává middleware:
- Zachycuje a zapisuje neošetřené výjimky.
- Znovu spustí žádost v alternativním kanálu pomocí uvedené cesty. Požadavek se znovu nespustí, pokud byla odpověď spuštěná. Kód vygenerovaný šablonou znovu spustí požadavek pomocí
/Errorcesty.
Upozornění
Pokud alternativní kanál vyvolá výjimku vlastní, middleware zpracování výjimek znovu vyvolá původní výjimku.
V následujícím příkladu UseExceptionHandler přidá middleware pro zpracování výjimek v Nevývojovém prostředí:
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
RazorŠablona aplikace stránky poskytuje chybovou stránku ( .cshtml ) a PageModel třídu ( ErrorModel ) ve složce Pages . V případě aplikace MVC obsahuje šablona projektu Error metodu akce a zobrazení chyb pro Home kontroler.
Middleware pro zpracování výjimek znovu spustí požadavek pomocí původní metody HTTP. Pokud je koncový bod obslužné rutiny chyb omezený na konkrétní sadu metod HTTP, spustí se pouze pro tyto metody HTTP. Například akce kontroleru MVC, která používá atribut, se [HttpGet] Spustí jenom pro požadavky GET. Chcete-li zajistit, aby všechny požadavky dosáhly vlastní stránky zpracování chyb, Neomezovat je na konkrétní sadu metod http.
Postup zpracování výjimek odlišně v závislosti na původní metodě HTTP:
- Pro Razor stránky vytvořte více metod obslužné rutiny. Můžete například použít
OnGetke zpracování výjimek Get a použítOnPostke zpracování výjimek post. - Pro MVC použijte atributy příkazu HTTP na více akcí. Můžete například použít
[HttpGet]ke zpracování výjimek Get a použít[HttpPost]ke zpracování výjimek post.
Pokud chcete neověřeným uživatelům dovolit zobrazit stránku vlastní zpracování chyb, ujistěte se, že podporuje anonymní přístup.
Přístup k výjimce
Použijte IExceptionHandlerPathFeature pro přístup k výjimce a původní cestě požadavku v obslužné rutině chyby. následující kód přidá ExceptionMessage na výchozí stránky/Error. cshtml. cs vygenerované šablonami ASP.NET Core:
[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";
}
}
}
Upozornění
Neslouží klientům informace o citlivých chybách. Obsluha chyb je bezpečnostní riziko.
Chcete-li otestovat výjimku v ukázkové aplikaci:
- Nastavte prostředí na produkční.
- Odstraňte komentáře z
webBuilder.UseStartup<Startup>();vProgram.cs. - Vyberte aktivovat výjimku na domovské stránce.
Lambda obslužné rutiny výjimek
Alternativou ke stránce vlastní obslužné rutiny výjimek je poskytnout lambda výraz UseExceptionHandler . Použití lambda umožňuje přístup k chybě před vrácením odpovědi.
Následující kód používá lambda pro zpracování výjimek:
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();
});
}
Upozornění
Neobsluhujte citlivé informace o chybách z IExceptionHandlerFeature klientů ani do nich IExceptionHandlerPathFeature . Obsluha chyb je bezpečnostní riziko.
Testování výrazu lambda zpracování výjimek v ukázkové aplikaci:
- Nastavte prostředí na produkční.
- Odstraňte komentáře z
webBuilder.UseStartup<StartupLambda>();vProgram.cs. - Vyberte aktivovat výjimku na domovské stránce.
UseStatusCodePages
ve výchozím nastavení aplikace ASP.NET Core neposkytuje stavovou stránku pro stavové kódy chyb HTTP, například 404 – nenalezeno. Když aplikace narazí na stavový kód chyby HTTP 400-599, který nemá tělo, vrátí stavový kód a prázdné tělo odpovědi. Chcete-li poskytnout stránky se stavovým kódem, použijte middleware stránky stavového kódu. Chcete-li povolit výchozí textové obslužné rutiny pro běžné chyby stavových kódů, zavolejte UseStatusCodePages v Startup.Configure metodě:
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();
});
}
Zavolejte UseStatusCodePages před middlewarem zpracování žádosti. Například volejte UseStatusCodePages před middleware statických souborů a middleware koncových bodů.
Pokud se UseStatusCodePages nepoužívá, navigace na adresu URL bez koncového bodu vrátí chybovou zprávu závislou na prohlížeči, která indikuje, že koncový bod nejde najít. Přejděte například na Home/Privacy2 . Při UseStatusCodePages volání funkce prohlížeč vrátí:
Status Code: 404; Not Found
UseStatusCodePages se obvykle nepoužívá v produkčním prostředí, protože vrací zprávu, která není užitečná pro uživatele.
Testování UseStatusCodePages v ukázkové aplikaci:
- Nastavte prostředí na produkční.
- Odstraňte komentáře z
webBuilder.UseStartup<StartupUseStatusCodePages>();vProgram.cs. - Vyberte odkazy na domovské stránce na domovské stránce.
Poznámka
Middleware stránky stavových kódů nezachytává výjimky. Chcete-li poskytnout vlastní stránku zpracování chyb, použijte stránku obslužné rutiny výjimky.
UseStatusCodePages s formátovacím řetězcem
Chcete-li přizpůsobit typ obsahu odpovědi a text, použijte přetížení UseStatusCodePages , které přijímá typ obsahu a řetězec formátu:
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();
});
}
V předchozím kódu {0} je zástupný symbol pro kód chyby.
UseStatusCodePages řetězec formátu se obvykle nepoužívá v produkčním prostředí, protože vrací zprávu, která není užitečná pro uživatele.
Chcete-li otestovat UseStatusCodePages ukázkovou aplikaci, odstraňte komentáře z webBuilder.UseStartup<StartupFormat>(); v Program.cs .
UseStatusCodePages s výrazem lambda
Chcete-li určit vlastní kód pro zpracování chyb a psaní odezvy, použijte přetížení UseStatusCodePages , které přijímá výraz lambda:
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 výraz lambda se obvykle nepoužívá v produkčním prostředí, protože vrací zprávu, která není užitečná pro uživatele.
Chcete-li otestovat UseStatusCodePages ukázkovou aplikaci, odstraňte komentáře z webBuilder.UseStartup<StartupStatusLambda>(); v Program.cs .
UseStatusCodePagesWithRedirects
UseStatusCodePagesWithRedirectsMetoda rozšíření:
- Odešle klientovi stavový kód 302 .
- Přesměruje klienta na koncový bod zpracování chyb uvedený v šabloně URL. Koncový bod pro zpracování chyb obvykle zobrazí informace o chybě a vrátí HTTP 200.
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();
});
}
Šablona adresy URL může obsahovat {0} zástupný symbol pro stavový kód, jak je znázorněno v předchozím kódu. Pokud šablona URL začíná na ~ (vlnovku), ~ je nahrazena aplikací PathBase . Při zadávání koncového bodu v aplikaci vytvořte zobrazení MVC nebo Razor stránku pro koncový bod. RazorPříklad stránky naleznete v tématu Pages/MyStatusCode. cshtml v ukázkové aplikaci.
Tato metoda se běžně používá, když aplikace:
- By měl přesměrování klienta na jiný koncový bod, obvykle v případech, kdy se chyba zpracovává v jiné aplikaci. U webových aplikací adresní řádek prohlížeče klienta odráží přesměrovaný koncový bod.
- Neměl by zachovávat a vracet původní stavový kód s počáteční odpovědí přesměrování.
Pokud chcete UseStatusCodePages otestovat ukázkovou aplikaci,odeberte komentáře z webBuilder.UseStartup<StartupSCredirect>(); v Program.cs .
UseStatusCodePagesWithReExecute
Rozšiřující UseStatusCodePagesWithReExecute metoda:
- Vrátí klientovi původní stavový kód.
- Vygeneruje text odpovědi tak, že znovu spouští kanál požadavku pomocí alternativní cesty.
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();
});
}
Pokud je v aplikaci zadaný koncový bod, vytvořte pro koncový bod zobrazení nebo stránku Razor MVC. Ujistěte se, že je umístěný před , aby bylo možné UseStatusCodePagesWithReExecute UseRouting požadavek přesměrovat na stavovou stránku. Příklad pages Razor najdete v souboru Pages/MyStatusCode2.cshtml v ukázkové aplikaci.
Tato metoda se běžně používá, když by aplikace měla:
- Zpracujte požadavek bez přesměrování na jiný koncový bod. U webových aplikací adresní řádek prohlížeče klienta odráží původně požadovaný koncový bod.
- Zachovat a vrátit původní stavový kód s odpovědí.
Šablony adresy URL a řetězce dotazu mohou obsahovat zástupný {0} symbol pro stavový kód. Šablona adresy URL musí začíná na / .
Koncový bod, který chybu zpracovává, může získat původní adresu URL, která chybu vygenerovala, jak je znázorněno v následujícím příkladu:
[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;
}
}
}
Příklad pages Razor najdete v souboru Pages/MyStatusCode2.cshtml v ukázkové aplikaci.
Pokud chcete UseStatusCodePages otestovat ukázkovou aplikaci,odeberte komentáře z webBuilder.UseStartup<StartupSCreX>(); v Program.cs .
Zákaz stránek stavového kódu
Pokud chcete zakázat stránky se stavovým kódem pro kontroler MVC nebo metodu akce, použijte atribut [SkipStatusCodePages].
Pokud chcete zakázat stránky stavového kódu pro konkrétní požadavky v metodě obslužné rutiny Pages nebo Razor v kontroleru MVC, použijte IStatusCodePagesFeature :
public void OnGet()
{
// using Microsoft.AspNetCore.Diagnostics;
var statusCodePagesFeature = HttpContext.Features.Get<IStatusCodePagesFeature>();
if (statusCodePagesFeature != null)
{
statusCodePagesFeature.Enabled = false;
}
}
Kód pro zpracování výjimek
Kód na stránkách zpracování výjimek může také vyvolat výjimky. Chybové stránky produkčního prostředí by se měly důkladně otestovat a pečlivě se vyhnout vyvolání vlastních výjimek.
Hlavičky odpovědi
Po odeslání hlaviček odpovědi:
- Aplikace nemůže změnit stavový kód odpovědi.
- Nespouštějí se žádné stránky nebo obslužné rutiny výjimek. Odpověď musí být dokončena nebo přerušeno připojení.
Zpracování výjimek serveru
Kromě logiky zpracování výjimek v aplikaci může implementace serveru HTTP zpracovat některé výjimky. Pokud server zachytí výjimku před odesláním hlaviček odpovědi, server odešle odpověď 500 - Internal Server Error bez textu odpovědi. Pokud server zachytí výjimku po odeslání hlaviček odpovědi, server připojení zavře. Požadavky, které aplikace nezvládá, zpracovává server. Jakákoli výjimka, ke které dojde, když server zpracovává požadavek, je zpracována zpracováním výjimek serveru. Vlastní chybové stránky aplikace, middleware pro zpracování výjimek a filtry toto chování neovlivní.
Zpracování výjimek při spuštění
Výjimky, ke kterým došlo při spuštění aplikace, může zpracovávat pouze hostitelská vrstva. Hostitele je možné nakonfigurovat tak, aby zachycoval chyby při spuštění a zachycoval podrobné chyby.
Vrstva hostování může zobrazit chybovou stránku pro zachycenou chybu při spuštění pouze v případě, že k chybě dojde po vazbě adresy nebo portu hostitele. Pokud vazba selže:
- Hostující vrstva protokoluje kritickou výjimku.
- Proces dotnet se zhroutí.
- Pokud je server HTTP , nezobrazí se žádná chybová Kestrel stránka.
Při spuštění ve službě IIS (nebo Azure App Service) nebo IIS Expressvrátí modul ASP.NET Core chybu procesu 502.5, pokud se proces nemůže spustit. Další informace naleznete v tématu Řešení ASP.NET Core potíží s Azure App Service a službou IIS.
Chybová stránka databáze
Filtr výjimek stránky Vývojář databáze zachycuje výjimky související s databází, které lze vyřešit AddDatabaseDeveloperPageExceptionFilter pomocí Entity Framework Core migrací. Když dojde k těmto výjimám, vygeneruje se odpověď HTML s podrobnostmi o možných akcích pro vyřešení problému. Tato stránka je povolená pouze ve vývojovém prostředí. Následující kód byl vygenerován šablonami ASP.NET Core Razor Pages, když byly zadány jednotlivé uživatelské účty:
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();
}
Filtry výjimek
V aplikacích MVC je možné filtry výjimek konfigurovat globálně nebo podle kontroleru nebo podle akce. V Razor aplikacích Pages je možné je nakonfigurovat globálně nebo podle modelu stránky. Tyto filtry zvládnou všechny neošetřené výjimky, ke kterým dojde při provádění akce kontroleru nebo jiného filtru. Další informace naleznete v tématu Filtry v ASP.NET Core.
Filtry výjimek jsou užitečné pro zachytávání výjimek, ke kterým dochází v rámci akcí MVC, ale nejsou tak flexibilní jako integrovaný middlewarepro zpracování výjimek , UseExceptionHandler . Pokud nepotřebujete provádět zpracování chyb odlišně v závislosti na tom, která akce MVC je zvolená, doporučujeme použít . UseExceptionHandler
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();
});
}
Chyby stavu modelu
Informace o zpracování chyb stavu modelu najdete v tématu Vazby modelu a Ověření modelu.
Další zdroje informací
Tom Dykstraa Steve Smith
Tento článek popisuje běžné přístupy ke zpracování chyb ve ASP.NET Core webových aplikacích. Informace Zpracování chyb ve ASP.NET Core rozhraní API o webových rozhraních API najdete v tématu .
Zobrazení nebo stažení ukázkového kódu. (Jakstáhnout.)
Stránka výjimky pro vývojáře
Na stránce Developer Exception Page (Výjimka vývojáře) se zobrazí podrobné informace o výjimce požadavků. Šablony ASP.NET Core generují následující kód:
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
Předchozí kód povolí stránku výjimky pro vývojáře, když je aplikace spuštěná ve vývojovém prostředí.
Šablony jsou před UseDeveloperExceptionPage libovolným middlewarem, takže výjimky jsou zachyceny v následujícím middlewaru.
Předchozí kód povolí stránku výjimky pro vývojáře jenom v případě, že je aplikace spuštěná ve vývojovém prostředí. Podrobné informace o výjimce by se neměly zobrazovat veřejně při spuštění aplikace v produkčním prostředí. Další informace o konfiguraci prostředí najdete v tématu Používání více prostředí v ASP.NET Core .
Stránka Developer Exception Page obsahuje následující informace o výjimce a požadavku:
- Trasování zásobníku
- Parametry řetězce dotazu , pokud jsou k nějaké
- Cookies if any
- Hlavičky
Stránka obslužné rutiny výjimky
Pokud chcete nakonfigurovat vlastní stránku zpracování chyb pro produkční prostředí, použijte middleware pro zpracování výjimek. Middleware:
- Zachycuje a protokoluje výjimky.
- Znovu provede požadavek v alternativním kanálu pro uvedenou stránku nebo kontroler. Pokud se odpověď spouštěla, požadavek se znovu nespouště. Šablona vygenerovaný kód znovu provede požadavek na
/Error.
V následujícím příkladu přidá middleware zpracování výjimek UseExceptionHandler v jiných než vývojových prostředích:
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
Šablona Razor aplikace Pages poskytuje chybovou stránku ( ) a třídu ( ) ve .cshtml PageModel ErrorModel složce Pages. Pro aplikaci MVC obsahuje šablona projektu metodu akce Chyba a zobrazení Chyba v Home kontroleru.
Neo označení metody akce obslužné rutiny chyb atributy metody HTTP, například HttpGet . Explicitní příkazy zabraňují tomu, aby se některé požadavky dostaly do metody . Pokud by se neověřeným uživatelům mělo zobrazit zobrazení chyb, povolte metodě anonymní přístup.
Přístup k výjimce
Slouží k přístupu k výjimce a původní cestě požadavku v kontroleru nebo stránce IExceptionHandlerPathFeature obslužné rutiny chyb:
[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";
}
}
}
Upozornění
Neposíloute klientům citlivé informace o chybách. Zobrazování chyb je bezpečnostním rizikem.
Pokud chcete aktivovat předchozí stránku zpracování výjimek, nastavte prostředí na produkční prostředí a vynutíte výjimku.
Lambda obslužné rutiny výjimky
Alternativou k vlastní stránce obslužné rutiny výjimky je poskytnutí výrazu lambda pro UseExceptionHandler . Použití lambda umožňuje přístup k chybě před vrácením odpovědi.
Tady je příklad použití lambdy pro zpracování výjimek:
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();
}
Do předchozího kódu se přidá , takže Internet Explorer prohlížeč zobrazí chybovou zprávu, a ne await context.Response.WriteAsync(new string(' ', 512)); chybovou zprávu IE. Další informace najdete v tomto GitHub.
Upozornění
Nenaslouchávejte citlivým informacím o IExceptionHandlerFeature chybách z IExceptionHandlerPathFeature klientů nebo klientům. Zobrazování chyb je bezpečnostním rizikem.
Pokud chcete zobrazit výsledek lambdy pro zpracování výjimek v ukázkové aplikaci ,použijte direktivy ProdEnvironment ErrorHandlerLambda preprocesoru a a na domovské stránce vyberte Aktivovat výjimku.
UseStatusCodePages
Ve výchozím nastavení ASP.NET Core aplikace neposkytuje stránku stavového kódu pro stavové kódy HTTP, například 404 – Nenašl se. Aplikace vrátí stavový kód a prázdný text odpovědi. Pokud chcete zadat znakové stránky stavu, použijte middleware Stránky stavového kódu.
Middleware je k dispozici prostřednictvím balíčku Microsoft.AspNetCore.Diagnostics.
Pokud chcete povolit výchozí obslužné rutiny pouze pro text pro běžné stavové kódy chyb, UseStatusCodePages zavolejte Startup.Configure metodu :
app.UseStatusCodePages();
Volejte UseStatusCodePages před zpracováním požadavku middleware (například Middleware static file a middleware MVC).
Pokud se koncový bod nepoužít, při přechodu na adresu URL bez koncového bodu se vrátí chybová zpráva závislá na prohlížeči, která značí, že se UseStatusCodePages koncový bod nenašel. Můžete například převigovat na Home/Privacy2 . Když UseStatusCodePages se volá , prohlížeč vrátí:
Status Code: 404; Not Found
UseStatusCodePages s formátovacím řetězcem
Pokud chcete přizpůsobit typ obsahu odpovědi a text, použijte přetížení , které přebírá UseStatusCodePages typ obsahu a formátovací řetězec:
app.UseStatusCodePages(
"text/plain", "Status code page, status code: {0}");
UseStatusCodePages s lambda
Pokud chcete zadat vlastní kód pro zpracování chyb a zápis odpovědi, použijte přetížení , UseStatusCodePages které přijímá výraz lambda:
app.UseStatusCodePages(async context =>
{
context.HttpContext.Response.ContentType = "text/plain";
await context.HttpContext.Response.WriteAsync(
"Status code page, status code: " +
context.HttpContext.Response.StatusCode);
});
UseStatusCodePagesWithRedirects
Rozšiřující UseStatusCodePagesWithRedirects metoda:
- Odešle klientovi stavový kód 302 – Nalezeno.
- Přesměruje klienta na umístění uvedené v šabloně adresy URL.
app.UseStatusCodePagesWithRedirects("/StatusCode?code={0}");
Šablona adresy URL může obsahovat {0} zástupný symbol pro stavový kód, jak je znázorněno v příkladu. Pokud šablona adresy URL začíná ~ znakem (tilda), nahradí se ~ znakem PathBase . Pokud v aplikaci nas ukazatel na koncový bod, vytvořte pro koncový bod zobrazení nebo Razor stránku MVC. Příklad pages Razor najdete v souboru Pages/StatusCode.cshtml v ukázkové aplikaci.
Tato metoda se běžně používá v případě, že aplikace:
- Měl by přesměrovat klienta na jiný koncový bod, obvykle v případech, kdy chyba zpracovává jiná aplikace. U webových aplikací adresní řádek prohlížeče klienta odráží přesměrovaný koncový bod.
- Neměl by zachovávat a vracet původní stavový kód s počáteční odpovědí přesměrování.
UseStatusCodePagesWithReExecute
Rozšiřující UseStatusCodePagesWithReExecute metoda:
- Vrátí klientovi původní stavový kód.
- Vygeneruje text odpovědi tak, že znovu spouští kanál požadavku pomocí alternativní cesty.
app.UseStatusCodePagesWithReExecute("/StatusCode","?code={0}");
Pokud v aplikaci nas ukazatel na koncový bod, vytvořte pro koncový bod zobrazení nebo Razor stránku MVC. Ujistěte se, že je umístěný před , aby bylo možné UseStatusCodePagesWithReExecute UseRouting požadavek přesměrovat na stavovou stránku. Příklad pages Razor najdete v souboru Pages/StatusCode.cshtml v ukázkové aplikaci.
Tato metoda se běžně používá, když by aplikace měla:
- Zpracujte požadavek bez přesměrování na jiný koncový bod. U webových aplikací adresní řádek prohlížeče klienta odráží původně požadovaný koncový bod.
- Zachovat a vrátit původní stavový kód s odpovědí.
Šablony adresy URL a řetězce dotazu mohou obsahovat zástupný symbol ( {0} ) pro stavový kód. Šablona adresy URL musí začíná lomítkem ( / ). Pokud v cestě používáte zástupný symbol, ověřte, že koncový bod (stránka nebo kontroler) může segment cesty zpracovat. Například stránka pro chyby Razor by měla přijmout volitelnou hodnotu segmentu cesty s @page direktivou :
@page "{code?}"
Koncový bod, který chybu zpracovává, může získat původní adresu URL, která chybu vygenerovala, jak je znázorněno v následujícím příkladu:
var statusCodeReExecuteFeature = HttpContext.Features.Get<IStatusCodeReExecuteFeature>();
if (statusCodeReExecuteFeature != null)
{
OriginalURL =
statusCodeReExecuteFeature.OriginalPathBase
+ statusCodeReExecuteFeature.OriginalPath
+ statusCodeReExecuteFeature.OriginalQueryString;
}
Neo označení metody akce obslužné rutiny chyb atributy metody HTTP, například HttpGet . Explicitní příkazy zabraňují tomu, aby se některé požadavky dostaly do metody . Pokud by se neověřeným uživatelům mělo zobrazit zobrazení chyb, povolte metodě anonymní přístup.
Zákaz stránek stavového kódu
Pokud chcete zakázat stránky stavového kódu pro kontroler MVC nebo metodu akce, použijte [SkipStatusCodePages] atribut .
Pokud chcete zakázat stránky stavového kódu pro konkrétní požadavky v metodě obslužné rutiny Pages nebo Razor v kontroleru MVC, použijte IStatusCodePagesFeature :
var statusCodePagesFeature = HttpContext.Features.Get<IStatusCodePagesFeature>();
if (statusCodePagesFeature != null)
{
statusCodePagesFeature.Enabled = false;
}
Kód pro zpracování výjimek
Kód na stránkách zpracování výjimek může vyvolat výjimky. Často je vhodné, aby se chybové stránky v produkčním prostředí skládaly z čistě statického obsahu.
Hlavičky odpovědi
Po odeslání hlaviček odpovědi:
- Aplikace nemůže změnit stavový kód odpovědi.
- Nespouštějí se žádné stránky nebo obslužné rutiny výjimek. Odpověď musí být dokončena nebo přerušeno připojení.
Zpracování výjimek serveru
Kromě logiky zpracování výjimek ve vaší aplikaci může implementace serveru HTTP zpracovat některé výjimky. Pokud server zachytí výjimku před odesláním hlaviček odpovědi, server odešle odpověď 500 – Vnitřní chyba serveru bez textu odpovědi. Pokud server zachytí výjimku po odeslání hlaviček odpovědi, server připojení zavře. Požadavky, které aplikace nezvládá, zpracovává server. Jakákoli výjimka, ke které dojde, když server zpracovává požadavek, je zpracována zpracováním výjimek serveru. Vlastní chybové stránky aplikace, middleware pro zpracování výjimek a filtry toto chování neovlivní.
Zpracování výjimek při spuštění
Výjimky, ke kterým došlo při spuštění aplikace, může zpracovávat pouze hostitelská vrstva. Hostitele je možné nakonfigurovat tak, aby zachycoval chyby při spuštění a zachycoval podrobné chyby.
Vrstva hostování může zobrazit chybovou stránku pro zachycenou chybu při spuštění pouze v případě, že k chybě dojde po vazbě adresy nebo portu hostitele. Pokud vazba selže:
- Hostující vrstva protokoluje kritickou výjimku.
- Proces dotnet se zhroutí.
- Pokud je server HTTP , nezobrazí se žádná chybová Kestrel stránka.
Při spuštění ve službě IIS (nebo Azure App Service) nebo IIS Expressvrátí modul ASP.NET Core chybu procesu 502.5, pokud se proces nemůže spustit. Další informace naleznete v tématu Řešení ASP.NET Core potíží s Azure App Service a službou IIS.
Chybová stránka databáze
Middleware chybové stránky databáze zachycuje výjimky související s databází, které lze vyřešit pomocí Entity Framework migrací. Když dojde k těmto výjimám, vygeneruje se odpověď HTML s podrobnostmi o možných akcích pro vyřešení problému. Tato stránka by měla být povolená pouze ve vývojovém prostředí. Povolte stránku přidáním kódu do Startup.Configure :
if (env.IsDevelopment())
{
app.UseDatabaseErrorPage();
}
UseDatabaseErrorPagevyžaduje balíček NuGet Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.
Filtry výjimek
V aplikacích MVC je možné filtry výjimek konfigurovat globálně nebo podle kontroleru nebo podle akce. V Razor aplikacích Pages je možné je nakonfigurovat globálně nebo podle modelu stránky. Tyto filtry zvládnou jakoukoli neošetřenou výjimku, ke které dochází při provádění akce kontroleru nebo jiného filtru. Další informace naleznete v tématu Filtry v ASP.NET Core.
Tip
Filtry výjimek jsou užitečné pro zachytávání výjimek, ke kterým dochází v rámci akcí MVC, ale nejsou tak flexibilní jako middleware pro zpracování výjimek. Doporučujeme použít middleware. Filtry používejte jenom v případě, že potřebujete provádět zpracování chyb odlišně v závislosti na tom, která akce MVC je zvolena.
Chyby stavu modelu
Informace o zpracování chyb stavu modelu najdete v tématu Vazby modelu a Ověření modelu.