Переопределение ответа BadRequest в ASP.NET Core ResourceFilter - PullRequest
0 голосов
/ 05 сентября 2018

Я реализую фильтр ресурсов для хранения недопустимых запросов в базе данных и переопределения возвращенного ответа BadRequest.

Я успешно сохранил недействительные запросы, но у меня проблемы с переопределением ответа, я попытался сделать следующее:

public class MyFilter : Attribute, IResourceFilter
{
    public void OnResourceExecuting(ResourceExecutingContext context)
    {
        ;
    }

    public void OnResourceExecuted(ResourceExecutedContext context)
    {
        if (!context.ModelState.IsValid)
        {
            //store request in data base
            context.Result= new BadRequestObjectResult(new MyErrorModel(){ID = "1",FriendlyMessage = "Your request was invalid"});
        }
    }
}

public class MyErrorModel
{
    public string FriendlyMessage { get; set; }
    public string ID { get; set; }
}

Но возвращенный ответ не переопределяется. Есть ли способ переопределить ответ внутри фильтров ресурсов?

P.S .: Я использую атрибут [ApiController].

1 Ответ

0 голосов
/ 05 сентября 2018

Как мы все знаем, IResourceFilter запускается сразу после фильтра авторизации и подходит для коротких циклов.

Однако вы не окажете никакого влияния на результат, установив Result=new BadRequestObjectResult() по завершении выполнения результата.

См. Рабочий процесс, как показано ниже:

enter image description here

В соответствии с описанным выше рабочим процессом, мы должны запустить MyFilter после этапа привязки модели и до этапа фильтра результатов. Другими словами, мы должны поместить логику в фильтр действий. Поскольку уже существует ActionFilterAttribute из коробки, просто создайте MyFilterAttribute, который наследуется от ActionFilterAttribute:

public class MyFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        if (!context.ModelState.IsValid)
        {
            //store request in data base
            context.Result = new BadRequestObjectResult(new MyErrorModel() { ID = "1", FriendlyMessage = "Your request was invalid" });
        }
    }
}

Вот скриншот, с которым работает фильтр:

enter image description here

[Изменить]:

Код контроллера, украшенный [ApiController]:

namespace App.Controllers
{
    [ApiController]
    [Route("Hello")]
    public class HelloController : Controller
    {
        [MyFilter]
        [HttpGet("index")]
        public IActionResult Index(int x)
        {
            var y =ModelState.IsValid;
            return View();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...