programing

WebAPI 2에서 DefaultInlineConstraintResolver 오류가 발생했습니다.

yellowcard 2023. 4. 25. 22:14
반응형

WebAPI 2에서 DefaultInlineConstraintResolver 오류가 발생했습니다.

웹 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를 한 번에 하나씩 새로운 프로젝트로 Import하여 실행하기 시작했습니다.이 새 프로젝트에서 IIS Express를 사용하면 기존 API 프로젝트에서와 동일한 결과를 얻을 수 있습니다.

제가 뭘 놓쳤죠?새로운 프로젝트를 수행하더라도 이러한 제약 조건 해결자 문제에 부딪히지 않고는 GET 요청을 할 수 없습니다.

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

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

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

에서 알 수 있듯, 이 오류는요.DefaultInlineConstraintResolver 제공되는 웹 API에는 께께에에 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")]

다음과 같은 방법으로 문자열을 유형으로 가져옵니다.

[HttpGet]
[Route("users/{name}")]
public User GetUserByName(string name) { ... }

기본적으로 유형을 지정하지 않습니다.

하나의 Undo 웹 API 메서드에 대한 API 경로를 설계했으며 경로에서 작업에 ENUM 데이터 유형 검증을 적용하려고 시도했는데 기본값 아래에 있습니다.InlineConstrainResolver 오류입니다.

오류: 시스템입니다.잘못된 작업입니다.예외: '기본 형식 '의 인라인 제약 조건 확인 프로그램입니다.InlineConstraintResolver'에서 '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 제약을 하려면 사용자 지정 ENUM을 생성해야 합니다.OrderCorrectionEnumRouteConstraintusing용 using using using using를 사용해서요.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 as string으로 선언했을 때 이 오류가 발생했습니다.그걸 int로 바꾸자 작동하기 시작했어요

[HttpGet][Route("testClass/master/{Type:string}")]

언급URL : https://stackoverflow.com/questions/23412021/defaultinlineconstraintresolver-error-in-webapi-2 입니다.

반응형