DefaultInlineConstraintResolver Fehler in WebAPI 2

Ich verwende Web-API 2 und erhalte die folgende Fehlermeldung, wenn ich mit IIS 7.5 in meiner lokalen Box einen POST an meine API-Methode sende.

The inline constraint resolver of type 'DefaultInlineConstraintResolver' was unable to resolve the following inline constraint: 'string'. Line 21: GlobalConfiguration.Configuration.EnsureInitialized(); 

Keine meiner APIs funktioniert mit IIS. Ich bin jedoch in der Lage, mein API-Projekt in Visual Studio mit IIS Express auszuführen und erfolgreich einen POST für meine Anmelde-API zu erstellen. Wenn ich jedoch eine GET-Anforderung an einen anderen API-Aufruf stelle, erhalte ich den Constraint Resolver-Fehler.

Um dies zu beheben, habe ich ein brandneues Web API 2-Projekt in Visual Studio erstellt und mit dem Importieren der vorhandenen APIs in das neue Projekt begonnen und ausgeführt, um sicherzustellen, dass sie funktionieren. Bei Verwendung von IIS Express mit diesem neuen Projekt erhalte ich dieselben Ergebnisse wie mit meinem vorhandenen API-Projekt.

Was fehlt mir hier? Selbst mit einem brandneuen Projekt kann ich keine GET-Anforderungen stellen, ohne auf das Problem des Constraint-Resolvers zu stoßen.

Der Fehler bedeutet, dass Sie irgendwo in einer Route etwas wie angegeben haben

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

“string” wird nicht benötigt, da es der angenommene Typ ist, wenn nichts anderes angegeben ist.

Wie der Fehler angibt, verfügt der DefaultInlineConstraintResolver , mit dem die Web-API ausgeliefert wird, nicht über eine Inline-Einschränkung namens string . Die standardmäßig unterstützten sind folgende:

 // 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) } 

Eine weitere Sache, wenn Sie int, bool oder andere Einschränkungen nicht verwenden können, ist es wichtig, dass Sie die Leerräume entfernen.

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

Ich habe diese Fehlermeldung auch erhalten, als ich in der Route ein Leerzeichen zwischen dem Variablennamen und dem Variablentyp hinterlassen habe:

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

Es sollte folgendes sein:

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

Ich habe diese Fehlermeldung erhalten, wenn Type als String deklariert wurde. Als ich das in int geändert habe, fing es an zu arbeiten

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

Ich entwarf eine API-Route für eine Undo-Web-API-Methode, und ich habe versucht, die ENUM-Datentypvalidierung auf die Aktion in der Route anzuwenden und unter DefaultInlineConstrainResolver Error aufgetreten

Fehler: System.InvalidOperationException: ‘Der Inline-Constraint-Resolver des Typs’ DefaultInlineConstraintResolver ‘konnte die folgende Inline-Einschränkung nicht auflösen:’ 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, } 

Um die ENUM-Einschränkung anzuwenden, müssen Sie mithilfe von IHttpRouteConstraint eine benutzerdefinierte OrderCorrectionEnumRouteConstraint erstellen.

 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; } } 

Weitere Informationen erhalten Sie unter https://rajeevdotnet.blogspot.com/2018/08/web-api-systeminvalidoperationexception.html