Проверка ядра asp.net после фильтров - PullRequest
0 голосов
/ 17 апреля 2019

Я хочу запустить некоторую настраиваемую логику для всех API (ядро asp.net), которые есть в нашем сервисе до проверки модели, но после привязки модели.Это возможно?Я пробовал ActionFilter, но он вызывается после проверки.Ресурсный фильтр у нас тоже не работает.Ценю вашу помощь.

1 Ответ

1 голос
/ 17 апреля 2019

Контроллеры Web API не должны проверять ModelState.IsVali d, если они имеют атрибут [ApiController].В этом случае автоматический ответ HTTP 400, содержащий сведения о проблеме, возвращается, когда состояние модели недопустимо.

Один из способов добиться того, чего вы хотите, - подавить это поведение.

Добавьте следующий код в ConfigureServices:

        services.Configure<ApiBehaviorOptions>(options =>
        {
            options.SuppressModelStateInvalidFilter = true;
        });

Затем вы можете добавить свой код в фильтр - например:

public class SampleActionFilter : IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext context)
    {
        // do something before the action executes
        if(context.ActionArguments != null && context.ActionArguments.Count > 0)
        {
            //WARNING - you should add "safe" code to access the dictionary
            //I have hardcoded the parameter name (data) here for sample only.
            var model = context.ActionArguments["data"];
        }
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {
        // do something after the action executes
    }
}

, конечно, вам необходимо применитьФильтр также - в примере ниже, я применил его глобально.Вы можете быть более конкретным, если хотите.

services.AddMvc(
            options => options.Filters.Add(new SampleActionFilter())
            ).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

В коде вашего контроллера вы также можете дополнительно использовать метод TryValidateModel, если хотите, например:

[Route("api/[controller]")]
[ApiController]
public class ProcessController : ControllerBase
{
    [HttpPost]
    public IActionResult Contact(FormDataModel data)
    {
        bool validated = TryValidateModel(data);

        if (!ModelState.IsValid)
        {
            ModelState.AddModelError("", "Id cannot be empty..");
            return Ok();
        }

        return Ok();
    }
}

Надеюсь, это поможетчтобы решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...