당신은 분을 확인하는 사용자 정의 경로 제약 조건을 만들 수 있습니다, 당신처럼 최대 값은 소원하고, 또한 당신이 HttpStatusCode
경우에는 제약 조건이 제대로 이행되지 지정할 수 있습니다.
var constraintResolver = new DefaultInlineConstraintResolver();
constraintResolver.ConstraintMap.Add("rangeWithStatus", typeof(RangeWithStatusRouteConstraint));
config.MapHttpAttributeRoutes(constraintResolver);
그리고 당신의 경로가 지금과 같이 할 수 있습니다 :이 경우 Conflict
에
public class MyController : ApiController
{
[Route("Number/{id:int:rangeWithStatus(2, 10, PreconditionFailed)}")]
public HttpResponseMessage GetNumber([FromUri] int id)
{
return Request.CreateResponse(HttpStatusCode.OK, id);
}
}
이의 캐릭터 라인 표현입니다
public class RangeWithStatusRouteConstraint : IHttpRouteConstraint
{
private readonly int _from;
private readonly int _to;
private readonly HttpStatusCode _statusCode;
public RangeWithStatusRouteConstraint(int from, int to, string statusCode)
{
_from = from;
_to = to;
if (!Enum.TryParse(statusCode, true, out _statusCode))
{
_statusCode = HttpStatusCode.NotFound;
}
}
public bool Match(HttpRequestMessage request, IHttpRoute route, string parameterName, IDictionary<string, object> values,
HttpRouteDirection routeDirection)
{
object value;
if (values.TryGetValue(parameterName, out value) && value != null)
{
var stringValue = value as string;
var intValue = 0;
if (stringValue != null && int.TryParse(stringValue, out intValue))
{
if (intValue >= _from && intValue <= _to)
{
return true;
}
//only throw if we had the expected type of value
//but it fell out of range
throw new HttpResponseException(_statusCode);
}
}
return false;
}
}
이제 특성 매핑에 등록해야 HttpStatusCode.Conflict
열거 형은 나중에 제약 조건의 열거 형 값으로 변환됩니다.
이러한 설정을 사용하면 값이 [2, 10] 범위를 벗어나면 웹 API 인프라가 기본값 404 대신 409 상태 코드로 응답합니다.