web-dev-qa-db-fra.com

Erreur DefaultInlineConstraintResolver dans Web API 2

J'utilise Web API 2 et le message d'erreur suivant s'affiche lorsque j'envoie un POST à ma méthode d'API à l'aide de 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 peux exécuter mon projet d'API dans Visual Studio avec IIS Express et créer avec succès un POST sur mon API de connexion. obtenir l'erreur de résolveur de contrainte.

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

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

114
Halcyon

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

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

"chaîne" n'est pas nécessaire car c'est le type supposé si rien d'autre n'est spécifié.

Comme l'erreur l'indique, la DefaultInlineConstraintResolver fournie avec l'API Web ne comporte pas de contrainte en ligne appelée string. Ceux pris en charge par défaut sont les suivants:

// 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) }
220
Kiran Challa

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

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

J'ai aussi eu cette erreur quand j'ai laissé un espace entre le nom de la variable et le type de la variable dans la route, comme ceci:

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

Ce devrait être le suivant:

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

J'ai conçu un itinéraire d'API pour une méthode d'API Web d'annulation et j'ai essayé d'appliquer la validation du type de données ENUM à une action de l'itinéraire et rencontré ci-dessous une erreur DefaultInlineConstrainResolver. 

Erreur: System.InvalidOperationException: 'La contrainte en ligne Le résolveur de type 'DefaultInlineConstraintResolver' était incapable de 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 variable OrderCorrectionEnumRouteConstraint personnalisée à 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 (c'est mon blog): https://rajeevdotnet.blogspot.com/2018/08/web-api-systeminvalidoperationexception.html pour plus de détails

0
Rajeev Tiwari

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

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