У меня есть настройки обработки ошибок следующим образом:
Startup.cs
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseMiddleware<ExceptionHandlerMiddleware>();
app.UseStatusCodePagesWithReExecute("/Error/Index");
//I Added this as a test but it had no effect.
app.Use((context, next) => {
context.SetEndpoint(null);
return next();
});
app.UseStaticFiles(new StaticFileOptions()
{
OnPrepareResponse = (context) =>
{
context.Context.Response.GetTypedHeaders()
.CacheControl = new CacheControlHeaderValue
{
MaxAge = TimeSpan.FromDays(30)
};
}
});
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
Теперь я проверил это, попробовав что-то вроде localhost / mynotexistantpage, и это работает, я получаюстраница ошибки. На самом деле в большинстве сценариев, когда я проверял это, я получил страницу с ошибкой. Но есть один сценарий, когда я не получаю эту страницу.
Если вы создаете действие после публикации (любое действие на самом деле) и вам требуется маркер защиты от подделки. Теперь, если вы отправляете форму этому методу, но в своем html удалите автоматически генерируемый токен подделки, сервер отвечает 400 статусом, и моя страница ошибки не используется. Страница, которую я получаю, является страницей, которую браузер использует по умолчанию, если вы ее не обслуживаете.
Дополнительное примечание: мой обработчик исключений даже не уловил эту ошибку. Конструктор обработчика выглядит примерно так:
public async Task Invoke(HttpContext context)
{
try
{
await _requestDelegate.Invoke(context);
}
catch (Exception exception)
{
HandleExceptionAsync(context, exception);
}
}
Почему это так и как я могу учесть все сценарии, когда дело доходит до обработки ошибок?