Web API 2를 사용하고 있으며 로컬 상자에서 IIS 7.5를 사용하여 API 메서드에 POST를 보낼 때 다음 오류가 발생합니다.
The inline constraint resolver of type 'DefaultInlineConstraintResolver' was unable to resolve the following inline constraint: 'string'.
Line 21: GlobalConfiguration.Configuration.EnsureInitialized();
IIS를 사용하는 API는 없습니다. 그러나 IIS Express를 사용하여 Visual Studio에서 API 프로젝트를 실행하고 로그인 API에 POST를 성공적으로 만들 수 있지만 다른 API 호출에 GET 요청을 시도하면 제약 조건 해결 오류가 발생합니다.
이 문제를 해결하기 위해 Visual Studio에서 새로운 Web API 2 프로젝트를 만들고 기존 API를 한 번에 하나씩 새 프로젝트로 가져 와서 작동시키기 시작했습니다. 이 새로운 프로젝트에서 IIS Express를 사용하면 기존 API 프로젝트에서와 동일한 결과를 얻습니다.
내가 여기서 무엇을 놓치고 있습니까? 아주 새로운 프로젝트 라하더라도이 제약 조건 해결 문제를 겪지 않으면 서 GET 요청을 할 수 없습니다.
답변
오류는 Route의 어딘가에 다음과 같은 것을 지정했음을 의미합니다.
[Route("SomeRoute/{someparameter:string}")]
“string”은 다른 것을 지정하지 않은 경우 가정 된 유형이므로 필요하지 않습니다.
오류에서 알 수 있듯이 DefaultInlineConstraintResolver
Web API와 함께 제공되는 인라인 제약 조건은 없습니다 string
. 기본적으로 지원되는 것은 다음과 같습니다.
// Type-specific constraints
{ "bool", typeof(BoolRouteConstraint) },
{ "datetime", typeof(DateTimeRouteConstraint) },
{ "decimal", typeof(DecimalRouteConstraint) },
{ "double", typeof(DoubleRouteConstraint) },
{ "float", typeof(FloatRouteConstraint) },
{ "guid", typeof(GuidRouteConstraint) },
{ "int", typeof(IntRouteConstraint) },
{ "long", typeof(LongRouteConstraint) },
// Length constraints
{ "minlength", typeof(MinLengthRouteConstraint) },
{ "maxlength", typeof(MaxLengthRouteConstraint) },
{ "length", typeof(LengthRouteConstraint) },
// Min/Max value constraints
{ "min", typeof(MinRouteConstraint) },
{ "max", typeof(MaxRouteConstraint) },
{ "range", typeof(RangeRouteConstraint) },
// Regex-based constraints
{ "alpha", typeof(AlphaRouteConstraint) },
{ "regex", typeof(RegexRouteConstraint) }
답변
int, bool 또는 다른 제약 조건을 사용할 수없는 경우 한 가지 더 중요한 것은 키에 민감하며 공백을 제거해야합니다.
//this will work
[Route("goodExample/{number:int}")]
[Route("goodExampleBool/{isQuestion:bool}")]
//this won't work
[Route("badExample/{number : int}")]
[Route("badExampleBool/{isQuestion : bool}")]
답변
변수 이름과 변수 유형 사이에 공백을 남길 때이 오류가 발생했습니다.
[HttpGet]
[Route("{id: int}", Name = "GetStuff")]
다음과 같아야합니다.
[HttpGet]
[Route("{id:int}", Name = "GetStuff")]
답변
하나의 Undo Web API 메소드에 대한 API 라우트를 설계했으며 라우트의 조치에 대해 ENUM 데이터 유형 유효성 검증을 적용하려고했으나 DefaultInlineConstrainResolver 오류 아래에서 발생했습니다.
오류 : System.InvalidOperationException : ”DefaultInlineConstraintResolver ‘유형의 인라인 제약 조건 해결 프로그램이 다음 인라인 제약 조건을 확인할 수 없습니다 :’ActionEnum ‘
[HttpGet]
[Route("api/orders/undo/{orderID}/action/{actiontype: OrderCorrectionActionEnum}")]
public IHttpActionResult Undo(int orderID, OrderCorrectionActionEnum actiontype)
{
_route(undo(orderID, action);
}
public enum OrderCorrectionActionEnum
{
[EnumMember]
Cleared,
[EnumMember]
Deleted,
}
ENUM 제한을 적용하려면 OrderCorrectionEnumRouteConstraint
을 사용하여 사용자 정의를 작성해야합니다 IHttpRouteConstraint
.
public class OrderCorrectionEnumRouteConstraint : IHttpRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
// You can also try Enum.IsDefined, but docs say nothing as to
// is it case sensitive or not.
var response = Enum.GetNames(typeof(OrderCorrectionActionEnum)).Any(s = > s.ToLowerInvariant() == values[parameterName].ToString().ToLowerInvariant());
return response;
}
public bool Match(HttpRequestMessage request, IHttpRoute route, string parameterName, IDictionary< string, object> values, HttpRouteDirection routeDirection)
{
bool response = Enum.GetNames(typeof(BlockCorrectionActionEnum)).Any(s = > s.ToLowerInvariant() == values[parameterName].ToString().ToLowerInvariant());
return response;
}
}
참조 (이것은 내 블로그입니다) : 자세한 내용은 https://rajeevdotnet.blogspot.com/2018/08/web-api-systeminvalidoperationexception.html
답변
Type이 string으로 선언되면이 오류가 발생했습니다. int로 변경하면 작동하기 시작했습니다.
[HttpGet][Route("testClass/master/{Type:string}")]
답변
