Как создать ответ после обработки исключения в фильтре?
Использую asp. net mvc 5 (сам проект типа web api, а не mvc). Хочу сделать фильтр исключений, который бы записывал в лог ошибку, а затем возвращал ответ.
Из действий контроллера ответы возвращаю через специальные методы, вроде Ok, InternalServerError. Для фильтра использую IExceptionFilter из пространства System.Web.Http.Filters, поскольку проект типа web api, а не mvc.
Вопрос в том, как вообще правильно организовать это дело. Допустим, в лог я записал, и хочу вернуть клиенту объект вроде { Result: false, Message: "Не удалось выполнить запрос: ошибка такая-то" }. Должен ли я сгенерировать ответ в самом фильтре, или может быть это вообще делается не тут, а просто заполняется какое-нибудь свойство, а ответ делается где-то еще.
Вот грубый пример кода: Контроллер:
[RoutePrefix("home")]
[BeforeResponseExceptionFilter]
public class HomeController : ApiController
{
[Route("test")]
public IHttpActionResult Test(string name, int age)
{
var pers = new Person() { Name = name, Age = age };
throw new Exception("Я тебе покушать принес");
return Ok(pers);
}
}
Фильтр:
public class BeforeResponseExceptionFilter : Attribute, IExceptionFilter
{
public bool AllowMultiple => throw new NotImplementedException();
public Task ExecuteExceptionFilterAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken)
{
throw new NotImplementedException();
}
}
Конечная цель - чтобы можно было выбрасывать исключения в случае логических ошибок, снабжая их пояснительным текстом для администратора и пользователя (отдельные тексты) и чтобы эти исключения ловились в едином месте, без необходимости делать это в каждом экшене. Текст администратора логируем в файл, а текст пользователя - возвращаем в http-ответе.