Не запускается пользовательский атрибут проверки ядра ASP.NET - PullRequest
0 голосов
/ 09 октября 2018

У меня есть метод GET в API Controller.Я хотел бы, чтобы этот метод был проверен с использованием пользовательского атрибута проверки, как показано ниже.Однако по некоторым причинам его не увольняют.

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
    public class CheckValidRoute : ValidationAttribute
    {
        private readonly string _apiRoute;
        private readonly string _operation;

        public override bool RequiresValidationContext { get { return true; } }

        public CheckValidRoute(string apiRoute, string operation)
        {
            _apiRoute = apiRoute;
            _operation = operation;
        }

        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
           //Validation logic here
        }
    }

Контроллер

public class TestController : ControllerBase
    {
        [HttpGet("production/{movieId}/Test")]
        [ProducesResponseType(typeof(ResponseModel<string>), 200)]
        [Authorize(Policy = SecurityConstants.PseudofilmAuthorizationPolicy)]
        [CheckValidRoute("production/{movieId}/Test", "GET")]
        public async Task<ResponseModel<string>> TestGet(long movieId)
        {
            return ResponseModelHelper.BuildResponse("Success", $"production/{movieId}/Test", "Test");
        }
    }

Я не уверен, чего мне здесь не хватает.

-Alan-

1 Ответ

0 голосов
/ 09 октября 2018

Вы используете неправильный базовый класс для реализации вашего атрибута.ValidationAttribute используется на Models для проверки значений их свойств.Примером этого является атрибут Required.

В вашем случае вы хотите реализовать ActionFilter, который может быть применен к методу контроллера и может выполнять проверку перед вызовом метода.Примером для вас может быть:

public class CheckValidRouteAttribute : ActionFilterAttribute
{
    private readonly string _apiRoute;
    private readonly string _operation;

    public CheckValidRouteAttribute(string apiRoute, string operation) : base()
    {
        _apiRoute = apiRoute;
        _operation = operation;
    }

    public override void OnActionExecuting(ActionExecutingContext context)
    {
        var request = context.HttpContext.Request;

        var method = request.Method;

        if (string.Compare(method, _operation, true) != 0)
        {
            context.Result = new BadRequestObjectResult("HttpMethod did not match");
        }
    }
}

В методе OnActionExecuting вы можете выполнять проверки объекта HttpContext.Request.Я оставил это как упражнение для вас, так как не знаю ваших точных требований: -)

После применения этого атрибута к вашему методу контроллера, будет вызываться OnActionExecuting до того, как метод контроллера будет вызван такВы можете сделать свою проверку.

Вы можете узнать больше о ActionFilters здесь

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