Вы правы в том, что оба промежуточного ПО предоставляют страницы ошибок. Тем не менее, у них есть два разных варианта использования, которые позволят использовать оба приложения в приложении одновременно. Чтобы понять различия, давайте посмотрим, как промежуточное ПО на самом деле работает внутри.
По сути, это то, что связующее ПО 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, вероятно, не потребуются кодовые страницы состояния, но все же может потребоваться обработчик исключений, который возвращает общий сбой и регистрирует все правильно.