Как показать пользовательскую страницу для 400 ошибок в .net core 3.0 - PullRequest
0 голосов
/ 25 октября 2019

У меня есть настройки обработки ошибок следующим образом:

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);
    }
}

Почему это так и как я могу учесть все сценарии, когда дело доходит до обработки ошибок?

Ответы [ 2 ]

1 голос
/ 29 октября 2019

Это было на самом деле 2 проблемы. Первая проблема - ошибка, и здесь можно найти обходной путь:

https://github.com/aspnet/AspNetCore/issues/13715#issuecomment-528929683

Вторая проблема состояла в том, что у меня есть автоматическая проверка на токене защиты от подделки. Это означает, что при повторном выполнении страницы это снова сообщение, и, таким образом, защита от подделки снова завершается сбоем, поэтому я не могу получить доступ к моей странице ошибки. Таким образом, решением было добавить атрибут IgnoreAntiforgeryToken на контроллере ошибок.

0 голосов
/ 25 октября 2019

При сбое проверки подделки сервер (ASP.Net Core) возвращает ошибку 404 и останавливает дальнейшую обработку запроса, и ни один из ваших обработчиков исключений не уловит эту ошибку. Что вы можете сделать, это использовать UseStatusCodePagesWithRedirects, как показано ниже

app.UseStatusCodePagesWithReExecute("/Error"); // "/Error" is your custom error handling page.

, а затем делать все, что вам нравится делать с ошибками.

Полный пример приложения здесь для обработки ошибок с использованием UseStatusCodePagesWithReExecute.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...