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.

Martín pescador
fuente

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) }
Kiran Challa
fuente
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}")]
Serban Popescu
fuente
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")]
Guerrero latino
fuente
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

Rajeev Tiwari
fuente
0

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

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