it-swarm.com.de

DefaultInlineConstraintResolver Fehler in der Web-API 2

Ich verwende Web-API 2 und erhalte die folgende Fehlermeldung, wenn ich POST an meine API-Methode mit IIS 7.5 in meiner lokalen Box 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 ein POST für meine Anmelde-API zu erstellen, aber wenn ich versuche, eine GET-Anforderung an einen anderen API-Aufruf zu stellen, kann ich Rufen Sie den Constraint Resolver-Fehler ab.

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. Durch die Verwendung von IIS Express bei diesem neuen Projekt erhalte ich dieselben exakten Ergebnisse wie bei meinem vorhandenen API-Projekt.

Was fehlt mir hier? Selbst mit einem brandneuen Projekt kann ich keine GET-Anforderungen stellen, ohne auf dieses Problem der Problemlösungsfunktion zu stoßen.

114
Halcyon

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 aus dem Fehler hervorgeht, hat die DefaultInlineConstraintResolver, mit der die Web-API ausgeliefert wird, keine 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) }
220
Kiran Challa

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

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

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")]
8
Latin Warrior

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: 'Die Inline-Einschränkung Resolver vom Typ 'DefaultInlineConstraintResolver' konnte nicht Löse die folgende Inline-Einschränkung: '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 OrderCorrectionEnumRouteConstraint eine benutzerdefinierte IHttpRouteConstraint 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;              
    }
}

Verweis (Dies ist mein Blog): https://rajeevdotnet.blogspot.com/2018/08/web-api-systeminvalidoperationexception.html für weitere Details

0
Rajeev Tiwari

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}")]
0
Yaniv