DefaultInlineConstraintResolver Error in WebAPI 2


140

Sto utilizzando l'API Web 2 e visualizzo il seguente errore quando invio un POST al mio metodo API utilizzando IIS 7.5 sulla mia casella locale.

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

Line 21: GlobalConfiguration.Configuration.EnsureInitialized();

Nessuna delle mie API funziona con IIS. Tuttavia, sono in grado di eseguire il mio progetto API in Visual Studio utilizzando IIS Express e eseguire correttamente un POST alla mia API di accesso, ma quando provo a fare una richiesta GET a un'altra chiamata API, ottengo l'errore del risolutore di vincoli.

Per risolvere questo problema, ho creato un nuovo progetto API Web 2 in Visual Studio e ho iniziato a importare le API esistenti nel nuovo progetto una alla volta e ad eseguirle per assicurarne il funzionamento. Usando IIS Express con questo nuovo progetto, ottengo gli stessi risultati esatti che ho avuto con il mio progetto API esistente.

Cosa mi sto perdendo qui? Anche con un nuovo progetto non sono in grado di effettuare richieste GET senza imbattermi in questo problema del risolutore di vincoli.

Risposte:


279

L'errore significa che da qualche parte in una rotta, hai specificato qualcosa di simile

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

"stringa" non è necessaria in quanto è il tipo assunto se non viene specificato nient'altro.

Come indica l'errore, l' DefaultInlineConstraintResolverAPI Web fornita non ha un vincolo inline chiamato string. Quelli supportati di default sono i seguenti:

// 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
Questo ha senso perché stavo vedendo gli errori. Avevo {string: type} nel mio attributo route. L'ho rimosso e ora funziona.
Halcyon,

3
@AndreasFurster: perché stringnon è possibile applicare alcun vincolo.
Dave, nuovo

31
"stringa" non è necessaria in quanto è il tipo assunto se non viene specificato nient'altro.
Andrew Jens,

1
@AndrewGray Questo elenco è disponibile qui: asp.net/web-api/overview/web-api-routing-and-actions/…
Elija Lofgren

2
Nel caso in cui il problema fosse dovuto al fatto che l'attributo route era: {string: type}, rimuovi semplicemente 'string:'
Asaf

33

Un'altra cosa se non puoi usare int, bool o qualsiasi altro vincolo è sensibile alle chiavi e devi rimuovere eventuali spazi bianchi.

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

1
Penseresti che li avessero fatti trim()dopo aver diviso e prima di fare un confronto ... Non tagliare le stringhe usate come chiavi è una mia grande peeve pet che risale ai miei giorni FoxPro.
DVK,

10

Ho anche ricevuto questo errore quando ho lasciato uno spazio tra il nome della variabile e il tipo di variabile nel percorso, in questo modo:

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

Dovrebbe essere il seguente:

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

1

Ho progettato una route API per un metodo di annullamento dell'API Web e ho provato ad applicare la convalida del tipo di dati ENUM sull'azione nella route e riscontrato sotto DefaultInlineConstrainResolver Error

Errore: System.InvalidOperationException: 'Il risolutore di vincoli inline di tipo' DefaultInlineConstraintResolver 'non è stato in grado di risolvere il seguente vincolo inline:' 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,
}

Per applicare il vincolo ENUM, è necessario creare personalizzato OrderCorrectionEnumRouteConstraintutilizzando 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;              
    }
}

Riferimento (Questo è il mio blog): https://rajeevdotnet.blogspot.com/2018/08/web-api-systeminvalidoperationexception.html per maggiori dettagli


0

Ho ricevuto questo errore quando si digita come dichiarato come stringa. Quando l'ho cambiato in int ha iniziato a funzionare

[HttpGet][Route("testClass/master/{Type:string}")]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.