У меня есть метод 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");
}
}
Я не уверен, чего здесь не хватает.
-Алан-
Вы используете неправильный базовый класс для реализации вашего атрибута. 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 здесь
CheckValidRouteAttribute
.