Ошибка DefaultInlineConstraintResolver в WebAPI 2


140

Я использую 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-запросы, не сталкиваясь с проблемой разрешения проблем.

Ответы:


279

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

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

«string» не требуется, так как это предполагаемый тип, если ничего не указано.

Как указывает на ошибку, DefaultInlineConstraintResolverтот веб-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) }

2
Это имеет смысл, почему я видел ошибки. В моем атрибуте маршрута было {string: type}. Я удалил его, и он работает сейчас.
Halcyon

3
@AndreasFurster: потому что stringне может применить никаких ограничений.
Дэйв Нью

31
«string» не требуется, так как это предполагаемый тип, если ничего не указано.
Эндрю Дженс

1
@AndrewGray Этот список доступен здесь: asp.net/web-api/overview/web-api-routing-and-actions/…
Элайджа Лофгрен

2
В случае, если проблема была в том, что атрибут маршрута, такой как: {string: type}, просто удалите 'string:'
Asaf

33

Еще одна вещь, если вы не можете использовать 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}")]

1
Вы могли бы подумать, что они это trim()сделают после разделения и перед сравнением ... Не обрезка строк, используемых в качестве ключей, - моя главная любимая мозоль, восходящая ко всем временам FoxPro.
ДВК

10

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

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

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

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

1

Я разработал маршрут 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

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

[HttpGet][Route("testClass/master/{Type:string}")]
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.