Содержание
По умолчанию приложение 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
позволяет получить доступ к полной информации о запросе. Для этого используется объект класса Status
, который аккумулирует в себе всю исчерпывающую информацию по запросу:
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.