public ValueTask InvokeAsync(IServerFilterContext context, Func <ValueTask> next) { var result = new DivideByResult { IsSuccess = true }; // invoke ValidateParameterAttribute.Validate for marked method parameters var parameters = context.ServiceMethodInfo.GetParameters(); for (var i = 0; i < parameters.Length; i++) { var parameter = parameters[i]; foreach (var attribute in parameter.GetCustomAttributes <ValidateParameterAttribute>()) { attribute.Validate(context.Request[i], parameter.Name, result); } } if (!result.IsSuccess) { // skip the method: pass non-success result to the client context.Response[0] = result; return(new ValueTask(Task.CompletedTask)); } // call the method return(next()); }
public override void Validate(object parameterValue, string parameterName, DivideByResult result) { if (Equals(Value, parameterValue)) { result.IsSuccess = false; result.ErrorMessages.Add(string.Format("{0} cannot be {1}.", parameterName, Value)); } }
public ValueTask <DivideByResult> DivideByAsync(int value, [Not(0), GreaterThan(10)] int divider, CancellationToken token) { var result = new DivideByResult { IsSuccess = true, Result = value / divider }; return(new ValueTask <DivideByResult>(result)); }
public override void Validate(object parameterValue, string parameterName, DivideByResult result) { if (parameterValue is int typedValue) { if (typedValue <= Value) { result.IsSuccess = false; result.ErrorMessages.Add(string.Format("{0} must be greater than {1}.", parameterName, Value)); } } else { result.IsSuccess = false; result.ErrorMessages.Add(string.Format("{0} must be Int32.", parameterName)); } }
public abstract void Validate(object parameterValue, string parameterName, DivideByResult result);