WebAPI 2의 DefaultInlineConstraintResolver 오류


140

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 요청을 할 수 없습니다.

답변:


279

오류는 Route의 어딘가에 다음과 같은 것을 지정했음을 의미합니다.

[Route("SomeRoute/{someparameter:string}")]

"string"은 다른 것을 지정하지 않은 경우 가정 된 유형이므로 필요하지 않습니다.

오류에서 알 수 있듯이 DefaultInlineConstraintResolverWeb 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) }

2
내가 왜 오류를보고 있었는지 이해가됩니다. 내 경로 속성에 {string : type}이 있습니다. 나는 그것을 제거하고 지금 작동하고 있습니다.
Halcyon

3
@AndreasFurster : string제약 조건을 적용 할 수 없기 때문입니다.
Dave New

31
"string"은 다른 것을 지정하지 않은 경우 가정 된 유형이므로 필요하지 않습니다.
Andrew Jens

1
@AndrewGray이 목록은 여기에 있습니다 : asp.net/web-api/overview/web-api-routing-and-actions/…
Elijah Lofgren

2
{string : type}과 같은 경로 속성으로 인해 문제가 발생한 경우 'string :'을 제거하십시오.
Asaf

33

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}")]

1
당신은 그들이 trim()분할 후와 비교를하기 전에 이것들을 했다고 생각할 것입니다 ... 키로 사용되는 줄을 다듬지 않는 것은 나의 FoxPro 시절로 거슬러 올라가는 나의 주요 애완 동물입니다.
DVK

10

변수 이름과 변수 유형 사이에 공백을 남길 때이 오류가 발생했습니다.

[HttpGet]
[Route("{id: int}", Name = "GetStuff")]

다음과 같아야합니다.

[HttpGet]
[Route("{id:int}", Name = "GetStuff")]

1

하나의 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


0

Type이 string으로 선언되면이 오류가 발생했습니다. int로 변경하면 작동하기 시작했습니다.

[HttpGet][Route("testClass/master/{Type:string}")]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.