Error de DefaultInlineConstraintResolver en WebAPI 2


140

Estoy usando Web API 2 y obtengo el siguiente error cuando envío una POST a mi método API usando IIS 7.5 en mi casilla local.

The inline constraint resolver of type 'DefaultInlineConstraintResolver' was unable to resolve the following inline constraint: 'string'.

Line 21: GlobalConfiguration.Configuration.EnsureInitialized();

Ninguna de mis API funciona con IIS. Sin embargo, puedo ejecutar mi proyecto de API en Visual Studio usando IIS Express y realizar con éxito una POST en mi API de inicio de sesión, pero cuando intento realizar una solicitud GET a otra llamada de API, aparece el error de resolución de restricciones.

Para solucionar este problema, creé un nuevo proyecto de Web API 2 en Visual Studio y comencé a importar las API existentes en el nuevo proyecto de una en una y las ejecuté para garantizar que funcionaran. Al usar IIS Express con este nuevo proyecto, obtengo los mismos resultados exactos que obtuve con mi proyecto API existente.

¿Que me estoy perdiendo aqui? Incluso con un proyecto nuevo, no puedo hacer solicitudes GET sin encontrarme con este problema de resolución de restricciones.

Respuestas:


279

El error significa que en algún lugar de una ruta, especificó algo como

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

"string" no es necesario ya que es el tipo supuesto si no se especifica nada más.

Como indica el error, la DefaultInlineConstraintResolverAPI web que se incluye no tiene una restricción en línea llamada string. Los admitidos por defecto son los siguientes:

// 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
Eso tiene sentido por qué estaba viendo los errores. Tenía {string: type} en mi atributo de ruta. Lo eliminé y está funcionando ahora.
Halcyon

3
@AndreasFurster: Porque stringno se puede aplicar ninguna restricción.
Dave New

31
"string" no es necesario ya que es el tipo supuesto si no se especifica nada más.
Andrew Jens

1
@AndrewGray Esta lista está disponible aquí: asp.net/web-api/overview/web-api-routing-and-actions/…
Elijah Lofgren

2
En caso de que el problema se deba a un atributo de ruta como: {string: type}, simplemente elimine el 'string:'
Asaf

33

Una cosa más si no puede usar int, bool o cualquier otra restricción es clave sensible y necesita eliminar los espacios en blanco.

//this will work
[Route("goodExample/{number:int}")]
[Route("goodExampleBool/{isQuestion:bool}")]
//this won't work
[Route("badExample/{number : int}")]
[Route("badExampleBool/{isQuestion : bool}")]

1
Uno pensaría que lo hicieron trim()después de dividirse y antes de hacer una comparación ... No recortar cadenas usadas como llaves es una de las principales preocupaciones mías que se remontan a mis días de FoxPro.
DVK

10

También recibí este error cuando dejé un espacio entre el nombre de la variable y el tipo de variable en la ruta, así:

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

Debería ser lo siguiente:

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

1

Diseñé una ruta API para un método Deshacer API web y traté de aplicar la validación de tipo de datos ENUM en la acción en la ruta y encontré a continuación Error DefaultInlineConstrainResolver

Error: System.InvalidOperationException: 'El solucionador de restricciones en línea de tipo' DefaultInlineConstraintResolver 'no pudo resolver la siguiente restricción en línea:' 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,
}

Para aplicar la restricción ENUM, tiene que crear personalizado OrderCorrectionEnumRouteConstraintutilizando 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;              
    }
}

Referencia (Este es mi blog): https://rajeevdotnet.blogspot.com/2018/08/web-api-systeminvalidoperationexception.html para más detalles


0

Obtuve este error cuando Type como declarado como cadena. Cuando cambié eso a int, comenzó a funcionar

[HttpGet][Route("testClass/master/{Type:string}")]
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.