Не запускается пользовательский атрибут проверки ядра ASP.NET

2

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

[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");
        }
    }

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

-Алан-

  • 0
    Как вы думаете, почему этот код должен быть запущен? У вас есть фильтр, который проверяет этот атрибут? Вы читали документы? Кроме того, это должно называться CheckValidRouteAttribute .
  • 0
    Имя это то, что я определенно проверю. Переместите его выше, чтобы авторизоваться, чтобы не мешать. docs.microsoft.com/en-us/aspnet/core/mvc/models/… для документов
Показать ещё 2 комментария
Теги:
asp.net-core
custom-attributes
validationattribute

1 ответ

3
Лучший ответ

Вы используете неправильный базовый класс для реализации вашего атрибута. 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 будет вызван до OnActionExecuting метода контроллера, чтобы вы могли выполнить проверку.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню