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
{
_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 "
}
Добавление поддержки запросов между источниками
Приложения API должны иметь политики, которые разрешают или запрещают взаимодействовать с ними клиентам, обращающимся из другого сервера. Такие типы запросов называются
На заметку! Дополнительные сведения о поддержке CORS ищите в документации по ссылке https://docs.microsoft.com/ru-ru/aspnet/core/security/cors
.
Создание политики CORS
Инфраструктура ASP.NET Core располагает развитой поддержкой конфигурирования CORS, включая методы для разрешения/запрещения заголовков, методов, источников, учетных данных и многого другого. В этом примере все будет оставлено максимально открытым.