UseExceptionHandler vs UseStatusCodePagesWithRedirects - PullRequest
0 голосов
/ 01 июля 2018

Я читал об обработке ошибок в ASP.NET Core и столкнулся с этими двумя способами:

  • UseExceptionHandler("/error")
  • UseStatusCodePagesWithRedirects("/error/{0}");

Мне интересно, в чем разница между этими двумя? Оба перенаправляют на страницу ошибки, так зачем использовать один поверх другого? Я даже видел, как некоторые люди использовали их одновременно.

1 Ответ

0 голосов
/ 01 июля 2018

Вы правы в том, что оба промежуточного ПО предоставляют страницы ошибок. Тем не менее, у них есть два разных варианта использования, которые позволят использовать оба приложения в приложении одновременно. Чтобы понять различия, давайте посмотрим, как промежуточное ПО на самом деле работает внутри.

По сути, это то, что связующее ПО StatusCodePages делает:

// …
await _next(context);
// …

// Do nothing if a response body has already been provided.
if (context.Response.HasStarted
    || context.Response.StatusCode < 400
    || context.Response.StatusCode >= 600
    || context.Response.ContentLength.HasValue
    || !string.IsNullOrEmpty(context.Response.ContentType))
{
    return;
}

var statusCodeContext = new StatusCodeContext(context, _options, _next);
await _options.HandleAsync(statusCodeContext);

Он выполняет конвейер, вызывая _next, и после того, как вызов вернулся (это означает, что все следующие промежуточные программы выполнили), он проверит текущий ответ: в основном, если есть код состояния ошибки или вообще нет содержимого, он выполнит кодовую страницу статуса, сигнализирующую код статуса HTTP.

Промежуточное программное обеспечение ExceptionHandler , с другой стороны, делает что-то совсем другое:

try
{
    await _next(context);
}
catch (Exception ex)
{
    // …
    try
    {
        // …

        await _options.ExceptionHandler(context);

        // …
        return;
    }
    catch (Exception ex2)
    {
        // Suppress secondary exceptions, re-throw the original.
        _logger.ErrorHandlerException(ex2);
    }
    throw; // Re-throw the original if we couldn't handle it
}

Это попытается вызвать конвейер промежуточного программного обеспечения и отловить любое исключение, которое оно может произвести. Затем он попытается запустить зарегистрированный обработчик исключений (который при установке пути в основном означает внутренний вызов этого пути и возврат его ответа).

Итак, подведем итог:

  • Промежуточное программное обеспечение StatusCodePages будет обрабатывать неуспешные ответы с кодом состояния и позволяет вам указать, например, Пользовательские страницы ошибок для таких вещей, как 404 Not Found.
  • Промежуточное программное обеспечение ExceptionHandler , с другой стороны, перехватит необработанные исключения в вашем приложении и позволит вам изящно обрабатывать их для конечного пользователя.

Оба промежуточных программного обеспечения имеют разные цели и фактически не пересекаются в том, что они делают. Поэтому часто имеет смысл включать их обоих, если, конечно, вы не решаете эти проблемы по-разному; например API, вероятно, не потребуются кодовые страницы состояния, но все же может потребоваться обработчик исключений, который возвращает общий сбой и регистрирует все правильно.

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