Erro DefaultInlineConstraintResolver no WebAPI 2

140

Estou usando a API da Web 2 e recebo o seguinte erro ao enviar um POST para o meu método de API usando o IIS 7.5 na minha caixa local.

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

Line 21: GlobalConfiguration.Configuration.EnsureInitialized();

Nenhuma das minhas APIs funciona usando o IIS. No entanto, sou capaz de executar meu projeto de API no Visual Studio usando o IIS Express e fazer um POST com êxito na minha API de logon, mas quando tento fazer uma solicitação GET para outra chamada de API, recebo o erro do resolvedor de restrições.

Para solucionar isso, criei um novo projeto de API da Web 2 no Visual Studio e comecei a importar as APIs existentes para o novo projeto, uma de cada vez, e executá-las para garantir que funcionem. Usando o IIS Express com este novo projeto, obtenho os mesmos resultados exatos que obtive no meu projeto de API existente.

O que estou perdendo aqui? Mesmo com um projeto novo, não sou capaz de fazer solicitações GET sem encontrar esse problema do resolvedor de restrições.

idílico
fonte

Respostas:

279

O erro significa que, em algum lugar de uma rota, você especificou algo como

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

"string" não é necessário, pois é o tipo assumido se nada mais for especificado.

Como o erro indica, a DefaultInlineConstraintResolverAPI da Web fornecida não possui uma restrição em linha chamada string. Os suportados padrão são os seguintes:

// 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) }
Kiran Challa
fonte
2
Isso faz sentido porque eu estava vendo os erros. Eu tinha {string: type} no meu atributo de rota. Eu o removi e está funcionando agora.
Halcyon
3
@AndreasFurster: porque stringnão pode aplicar nenhuma restrição.
Dave New
31
"string" não é necessário, pois é o tipo assumido se nada mais for especificado.
Andrew Jens
1
@AndrewGray Esta lista está disponível aqui: asp.net/web-api/overview/web-api-routing-and-actions/…
Elijah Lofgren
2
Caso o problema ocorra devido ao atributo de rota como: {string: type}, basta remover o 'string:'
Asaf
33

Mais uma coisa, se você não pode usar int, bool ou qualquer outra restrição, é sensível às chaves e é necessário remover quaisquer espaços em branco.

//this will work
[Route("goodExample/{number:int}")]
[Route("goodExampleBool/{isQuestion:bool}")]
//this won't work
[Route("badExample/{number : int}")]
[Route("badExampleBool/{isQuestion : bool}")]
Serban Popescu
fonte
1
Você pensaria que eles fariam trim()isso depois de dividir e antes de fazer uma comparação ... Não cortar cordas usadas como chaves é uma grande irritação minha que remonta aos meus dias no FoxPro.
DVK 25/07
10

Também recebi esse erro quando deixei um espaço entre o nome da variável e o tipo de variável na rota, assim:

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

Deve ser o seguinte:

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

Projetei uma rota de API para um método Undo Web API e tentei aplicar a validação do tipo de dados ENUM na ação na rota e encontrada abaixo Erro DefaultInlineConstrainResolver

Erro: System.InvalidOperationException: 'O resolvedor de restrições em linha do tipo' DefaultInlineConstraintResolver 'não pôde resolver a seguinte restrição em linha:' 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,
}

Para aplicar a restrição ENUM, é necessário criar personalizado OrderCorrectionEnumRouteConstraintusando 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;              
    }
}

Referência (este é o meu blog): https://rajeevdotnet.blogspot.com/2018/08/web-api-systeminvalidoperationexception.html para obter mais detalhes

Rajeev Tiwari
fonte
0

Eu recebi esse erro ao digitar como declarado como string. Quando mudei isso para int, ele começou a funcionar

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