Erreur DefaultInlineConstraintResolver dans WebAPI 2


140

J'utilise Web API 2 et j'obtiens l'erreur suivante lorsque j'envoie un POST à ​​ma méthode API à l'aide d'IIS 7.5 sur ma boîte locale.

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

Line 21: GlobalConfiguration.Configuration.EnsureInitialized();

Aucune de mes API ne fonctionne avec IIS. Cependant, je suis en mesure d'exécuter mon projet d'API dans Visual Studio à l'aide d'IIS Express et de réussir un POST à ​​mon API de connexion, mais lorsque j'essaie de faire une requête GET à un autre appel d'API, j'obtiens l'erreur du résolveur de contraintes.

Afin de résoudre ce problème, j'ai créé un tout nouveau projet Web API 2 dans Visual Studio et j'ai commencé à importer les API existantes dans le nouveau projet une à la fois et à les exécuter pour m'assurer qu'elles fonctionnent. En utilisant IIS Express avec ce nouveau projet, j'obtiens les mêmes résultats exacts qu'avec mon projet d'API existant.

Qu'est-ce que j'oublie ici? Même avec un tout nouveau projet, je ne suis pas en mesure de faire des requêtes GET sans rencontrer ce problème de résolution de contraintes.

Réponses:


279

L'erreur signifie que quelque part dans une Route, vous avez spécifié quelque chose comme

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

"string" n'est pas nécessaire car il s'agit du type supposé si rien d'autre n'est spécifié.

Comme l'indique l'erreur, l' DefaultInlineConstraintResolverAPI Web fournie avec n'a pas de contrainte en ligne appelée string. Les options prises en charge par défaut sont les suivantes:

// 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
C'est logique pourquoi je voyais les erreurs. J'avais {string: type} dans mon attribut de route. Je l'ai enlevé et ça marche maintenant.
Halcyon

3
@AndreasFurster: Parce que je stringne peux appliquer aucune contrainte.
Dave New

31
"string" n'est pas nécessaire car il s'agit du type supposé si rien d'autre n'est spécifié.
Andrew Jens

1
@AndrewGray Cette liste est disponible ici: asp.net/web-api/overview/web-api-routing-and-actions/…
Elijah Lofgren

2
Dans le cas où le problème serait dû au fait que l'attribut d'itinéraire tel que: {string: type}, supprimez simplement la "chaîne:"
Asaf

33

Une dernière chose si vous ne pouvez pas utiliser int, bool ou toute autre contrainte, il est sensible à la clé et vous devez supprimer les espaces blancs.

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

1
On pourrait penser qu'ils trim()les ont après le fractionnement et avant de faire une comparaison ... Ne pas couper les cordes utilisées comme clés est une bête noire majeure de la mienne depuis mes jours FoxPro.
DVK

10

J'ai également eu cette erreur lorsque j'ai laissé un espace entre le nom de la variable et le type de variable dans l'itinéraire, comme ceci:

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

Ce devrait être le suivant:

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

1

J'ai conçu une route API pour une méthode d'API Web Undo et j'ai essayé d'appliquer la validation du type de données ENUM à l'action dans la route et j'ai rencontré sous Erreur DefaultInlineConstrainResolver

Erreur: System.InvalidOperationException: «Le résolveur de contraintes en ligne de type« DefaultInlineConstraintResolver »n'a pas pu résoudre la contrainte en ligne suivante:« 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,
}

Pour appliquer la contrainte ENUM, vous devez créer une personnalisation OrderCorrectionEnumRouteConstraintà l'aide de 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;              
    }
}

Référence (Ceci est mon blog): https://rajeevdotnet.blogspot.com/2018/08/web-api-systeminvalidoperationexception.html pour plus de détails


0

J'ai eu cette erreur lorsque Type est déclaré en tant que chaîne. Quand j'ai changé ça en int, ça a commencé à fonctionner

[HttpGet][Route("testClass/master/{Type:string}")]
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.