Asp.net web api 验证WebAPI操作的参数

Asp.net web api 验证WebAPI操作的参数,asp.net-web-api,Asp.net Web Api,我有一个WebAPI操作,我希望提供一个参数来匹配特定的正则表达式(或其他验证属性,比如[Range(1,20)])。提供的参数恰好也是URL的一部分 [Route("api/stuff/{id}")] public HttpResponseMessage Get([RegularExpression(@"^\d+-[a-z]{3}$")] id) { if (!ModelState.IsValid) { return Request.CreateResponse(Htt

我有一个WebAPI操作,我希望提供一个参数来匹配特定的正则表达式(或其他验证属性,比如
[Range(1,20)]
)。提供的参数恰好也是URL的一部分

[Route("api/stuff/{id}")]
public HttpResponseMessage Get([RegularExpression(@"^\d+-[a-z]{3}$")] id) {
    if (!ModelState.IsValid) {
        return Request.CreateResponse(HttpStatusCode.BadRequest);
    }

    //do stuff
}
不幸的是,即使值与正则表达式不匹配,模型状态也始终有效


我该如何验证此URL段?

是否应该进行验证?试过这个

[Route("api/stuff/{id:regex(^\d+-[a-z]{3}$)}")]

正如@Pratik所建议的,路由约束是最简单/最简单的方法

我创建了一个验证属性,如下所示:

[AttributeUsage(AttributeTargets.Property, Inherited = true, AllowMultiple = false)]
public sealed class IPAddressAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        dynamic address = validationContext.ObjectInstance;

        long? scope = address.ScopeId;

        var isValid = IPAddresses.IsValid(value as string, scope);

        var result = ValidationResult.Success;

        if (!isValid)
            result = new ValidationResult("The provided IP Address is not a valid IPv4 or IPv6 address");

        return result;
    }
}
然后可以从路由约束中使用该约束:

public class IPAddressRouteConstraint : IHttpRouteConstraint {
    public bool Match(HttpRequestMessage request, IHttpRoute route, string parameterName, IDictionary<string, object> values, HttpRouteDirection routeDirection)
    {
        object value;
        if (!values.TryGetValue(parameterName, out value))
            return false;

        var attr = new IPAddressAttribute();

        return attr.IsValid(value);
    }
}
公共类IPAddressRouteConstraint:IHttpRouteConstraint{
公共布尔匹配(HttpRequestMessage请求、IHttpRoute路由、字符串参数名称、IDictionary值、HttpRouteDirection路由方向)
{
目标价值;
如果(!values.TryGetValue(parameterName,out value))
返回false;
var attr=新的IPAddressAttribute();
返回attr.IsValid(值);
}
}

通过这种方式,它在路线和模型验证中共享(取决于我需要逻辑的地方)。

澄清了我的问题。我使用了
RegularExpressionAttribute
,因为它是最简单的,但它可以是任何验证属性(范围、数据类型、自定义属性),您可以使用路由约束来限制参数吗