Обработка ошибок в ASP.NET Core. Обработка ошибок HTTP

По умолчанию приложение ASP.NET Core не предоставляет пользователю страницу с кодом состояния HTTP, таких как код 404 Not Found. Когда в приложении устанавливается код состояния ошибки HTTP 400–599 без текста, возвращается код состояния и пустой текст ответа. При этом ASP.NET Core позволяет обрабатывать ошибки HTTP, используя ещё один компонент middleware

UseStatusCodePages

Метод UseStatusCodePages включает обработчики по умолчанию для распространенных ошибок HTTP. Например,

public static void Main(string[] args)
 {
     var builder = WebApplication.CreateBuilder(args);
     var app = builder.Build();

     app.UseStatusCodePages();

     app.MapGet("/", async (context) => {
         context.Response.StatusCode = 404;
     });

     app.Run();
 }

здесь в обработчике конечной точки пользователю возвращается код 404. Использование UseStatusCodePages позволяет выдать пользователю следующую страницу:

Форматированный вывод сообщения об ошибке HTTP

Метод UseStatusCodePages имеет ряд перегрузок, позволяющих настроить вывод информации об ошибке HTTP. Например, можно настроить формат вывода об ошибке, используя следующую версию метода

app.UseStatusCodePages(System.Net.Mime.MediaTypeNames.Text.Html, "<b>HTTP error</b>: {0}");

в этом случае, на место {0} будет подставляться код HTTP, а сама страница будет передана в формате html:

Использование обработчика ошибок HTTP

Ещё одна перегрузка метода UseStatusCodePages позволяет получить доступ к полной информации о запросе. Для этого используется объект класса StatusCodeContext, который аккумулирует в себе всю исчерпывающую информацию по запросу:

app.UseStatusCodePages(async (statusCodeCtx) =>
{
    var path = statusCodeCtx.HttpContext.Request.Path;
    var code = statusCodeCtx.HttpContext.Response.StatusCode;

    statusCodeCtx.HttpContext.Response.ContentType = "text/html; charset=utf-8";

    switch (code)
    {
        case 404:
            {
                await statusCodeCtx.HttpContext.Response.WriteAsync($"Ресурс не найден. Сервер вернул код ошибки <b>{code}</b>");
                break;
            }
        case 500:
            {
                await statusCodeCtx.HttpContext.Response.WriteAsync($"На сервере возникла ошибка. Сервер вернул код ошибки <b>{code}</b>");
                break;
            }
        default:
            {
                await statusCodeCtx.HttpContext.Response.WriteAsync($"Мы уже в курсе ошибки и работаем над её устранением. Оставайтесь с нами");
                break;
            }
    }
});

Результат

UseStatusCodePagesWithRedirects

Метод UseStatusCodePagesWithRedirects при получении ошибки HTTP позволяет перенаправить пользователя на заданную страницу с кодом состояния 302. Например,

app.UseStatusCodePagesWithRedirects("/StatusCode/{0}");

app.MapGet("/StatusCode/{id:int}",(int id)=>
{
    return $"Http error: {id}";
});

результат

то есть, на место {0} подставляется код статуса HTTP.

UseStatusCodePagesWithReExecute

Метод UseStatusCodePagesWithReExecute похож на предыдущий, но возвращает пользователю оригинальный код статуса (не использует перенаправление). Здесь стоит отметить только одну из перегрузок этого метода, которая позволяет использовать код статуса не в пути, а в параметре URL:

app.UseStatusCodePagesWithReExecute("/error", "?statusCode={0}");

app.MapGet("/error",(int statusCode) =>
{
    return $"Http error: {statusCode}";
});

в этом случае результат будет следующий:

при этом, пользователь получит оригинальный код статуса HTTP.

Итого

По умолчанию приложение ASP.NET Core не предоставляет пользователю страницу с кодом состояния HTTP, однако, используя методы UseStatusCodePages, UseStatusCodePagesWithRedirects и UseStatusCodePagesWithReExecute мы можем настроить приложение для вывода пользователю информации об ошибках HTTP.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии