Чтение онлайн

на главную - закладки

Жанры

Язык программирования C#9 и платформа .NET5
Шрифт:

}

}

В отличие от большинства фильтров в ASP.NET Core, которые имеют обработчик событий "перед" и "после", фильтры исключений располагают только одним обработчиком:

OnException
(или
OnExceptionAsync
). Обработчик принимает один параметр,
ExceptionContext
, который предоставляет доступ к
ActionContext
, а также к сгенерированному исключению.

Кроме того, фильтры принимают участие во внедрении зависимостей, позволяя получить доступ в коде к любому элементу внутри контейнера. В рассматриваемом

примере вам необходим экземпляр реализации
IWebHostEnvironment
, внедренный в фильтр, который будет использоваться для выяснения среды времени выполнения. Если средой является
Development
, тогда ответ должен также включать трассировку стека. Добавьте переменную уровня класса для хранения экземпляра реализации
IWebHostEnvironment
и конструктор:

private readonly IWebHostEnvironment _hostEnvironment;

public CustomExceptionFilterAttribute(IWebHostEnvironment hostEnvironment)

{

_hostEnvironment = hostEnvironment;

}

Код в обработчике

OnException
проверяет тип сгенерированного исключения и строит соответствующий ответ. В случае среды
Development
в сообщение ответа включается трассировка стека. Затем создается динамический объект, который содержит значения для отправки вызывающему запросу, и возвращается в
IActionResult
. Вот модифицированный код метода:

public override void OnException(ExceptionContext context)

{

var ex = context.Exception;

string stackTrace = _hostEnvironment.IsDevelopment

? context.Exception.StackTrace :
string.Empty;

string message = ex.Message;

string error;

IActionResult actionResult;

switch (ex)

{

case DbUpdateConcurrencyException ce:

// Возвращается код HTTP 400.

error = "Concurrency Issue.";

actionResult = new BadRequestObjectResult(

new {Error = error, Message = message, StackTrace = stackTrace});

break;

default:

error = "General Error.";

actionResult = new ObjectResult(

new {Error = error, Message = message, StackTrace = stackTrace})

{

StatusCode = 500

};

break;

}

//context.ExceptionHandled = true; // Если убрать здесь комментарий,

// то исключение поглощается

context.Result = actionResult;

}

Если вы хотите, чтобы фильтр исключений поглотил исключение и установил код состояния в 200 (скажем, для регистрации ошибки в журнале,

не возвращая ее клиенту), тогда поместите следующую строку перед установкой
Result
(в предыдущем примере кода просто уберите комментарий):

context.ExceptionHandled = true;

Добавление фильтров в конвейер обработки

Фильтры можно применять к методам действий, контроллерам или глобально к приложению. Код "перед" фильтров выполняется снаружи вовнутрь (глобальный, контроллер, метод действия), в то время как код "после" фильтров выполняется изнутри наружу (метод действия, контроллер, глобальный).

На уровне приложения фильтры добавляются в методе

ConfigureServices
класса
Startup
. Откройте файл класса
Startup.cs
и поместите в начало файла следующий оператор
using
:

using AutoLot.Api.Filters;

Модифицируйте метод

AddControllers
, добавив специальный фильтр:

services

.AddControllers(config => config.Filters.Add(

new CustomExceptionFilterAttribute(_env)))

.AddJsonOptions(options =>

{

options.JsonSerializerOptions.PropertyNamingPolicy = null;

options.JsonSerializerOptions.WriteIndented = true;

})

.ConfigureApiBehaviorOptions(options =>

{

...

});

Тестирование фильтра исключений

Чтобы протестировать фильтр исключений, откройте файл

WeatherForecastController.cs
и обновите метод действия
Get
показанным ниже кодом:

[HttpGet]

public IEnumerable<WeatherForecast> Get

{

_logger.LogAppWarning("This is a test");

throw new Exception("Test Exception");

...

}

Запустите приложение и испытайте метод с использованием Swagger. Результаты, отображенные в пользовательском интерфейсе Swagger должны соответствовать следующему выводу (трассировка стека приведена с сокращениями):

{

"Error": "General Error.",

"Message": "Test Exception",

"StackTrace": " at AutoLot.Api.Controllers.WeatherForecastController.Get in

D:\\Projects\\Books\\csharp9-wf\\Code\\New\\Chapter_30\\AutoLot.Api\\Controllers\\

WeatherForecastController.cs:line 31\r\n "

}

Добавление поддержки запросов между источниками

Поделиться:
Популярные книги

Черный Маг Императора 6

Герда Александр
6. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
7.00
рейтинг книги
Черный Маг Императора 6

Оцифрованный. Том 1

Дорничев Дмитрий
1. Линкор Михаил
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Оцифрованный. Том 1

Кодекс Охотника. Книга XIV

Винокуров Юрий
14. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XIV

Штуцер и тесак

Дроздов Анатолий Федорович
1. Штуцер и тесак
Фантастика:
боевая фантастика
альтернативная история
8.78
рейтинг книги
Штуцер и тесак

Я снова граф. Книга XI

Дрейк Сириус
11. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я снова граф. Книга XI

Болотник

Панченко Андрей Алексеевич
1. Болотник
Фантастика:
попаданцы
альтернативная история
6.50
рейтинг книги
Болотник

Кодекс Крови. Книга III

Борзых М.
3. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга III

Жестокая свадьба

Тоцка Тала
Любовные романы:
современные любовные романы
4.87
рейтинг книги
Жестокая свадьба

Стеллар. Трибут

Прокофьев Роман Юрьевич
2. Стеллар
Фантастика:
боевая фантастика
рпг
8.75
рейтинг книги
Стеллар. Трибут

Голодные игры

Коллинз Сьюзен
1. Голодные игры
Фантастика:
социально-философская фантастика
боевая фантастика
9.48
рейтинг книги
Голодные игры

Последняя Арена 8

Греков Сергей
8. Последняя Арена
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Последняя Арена 8

Черный маг императора 2

Герда Александр
2. Черный маг императора
Фантастика:
юмористическая фантастика
попаданцы
аниме
6.00
рейтинг книги
Черный маг императора 2

Последний Паладин

Саваровский Роман
1. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин

Измена. Свадьба дракона

Белова Екатерина
Любовные романы:
любовно-фантастические романы
эро литература
5.00
рейтинг книги
Измена. Свадьба дракона