it-swarm.com.ru

Ошибка DefaultInlineConstraintResolver в веб-API 2

Я использую Web API 2 и получаю следующую ошибку, когда отправляю POST своему методу API с помощью IIS 7.5 на моем локальном компьютере.

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

Line 21: GlobalConfiguration.Configuration.EnsureInitialized();

Ни один из моих API не работает с IIS. Однако я могу запустить свой проект API в Visual Studio с помощью IIS Express и успешно выполнить POST для моего API входа в систему, но когда я пытаюсь выполнить запрос GET для другого вызова API, я получить ошибку распознавателя ограничений.

Чтобы устранить эту проблему, я создал новый проект Web API 2 в Visual Studio и начал импортировать существующие API в новый проект по одному и запускать их, чтобы убедиться, что они работают. Используя IIS Express с этим новым проектом, я получаю те же точные результаты, что и с моим существующим проектом API.

Что мне здесь не хватает? Даже с совершенно новым проектом я не могу делать запросы GET, не сталкиваясь с проблемой разрешения проблем.

114
Halcyon

Ошибка означает, что где-то в маршруте, вы указали что-то вроде

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

"строка" не нужна, так как это предполагаемый тип, если ничего не указано.

Как указывает ошибка, DefaultInlineConstraintResolver, с которым поставляется Web API, не имеет встроенного ограничения, называемого string. По умолчанию поддерживаются следующие:

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

Еще одна вещь, если вы не можете использовать int, bool или любое другое ограничение, это чувствительно к ключу, и вам нужно удалить все пробелы.

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

Я также получил эту ошибку, когда оставил пробел между именем переменной и типом переменной в маршруте, например, так:

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

Должно быть следующее:

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

Я разработал маршрут API для одного метода Undo Web API и попытался применить проверку типа данных ENUM к действию в маршруте. Обнаружена ошибка DefaultInlineConstrainResolver. 

Ошибка: System.InvalidOperationException: 'Встроенное ограничение преобразователь типа «DefaultInlineConstraintResolver» не смог устранить следующее встроенное ограничение: '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,
}

Чтобы применить ограничение ENUM, вы должны создать свой собственный OrderCorrectionEnumRouteConstraint, используя 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;              
    }
}

Ссылка (это мой блог): https://rajeevdotnet.blogspot.com/2018/08/web-api-systeminvalidoperationexception.html для более подробной информации

0
Rajeev Tiwari

Я получил эту ошибку, когда Type объявлен как строка. Когда я изменил это на Int, он начал работать

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