Ошибка DefaultInlineConstraintResolver в WebAPI 2

83

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

Теги:
iis
asp.net-web-api

3 ответа

137
Лучший ответ

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

[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) }
  • 2
    Это имеет смысл, почему я видел ошибки. В моем атрибуте маршрута было {string: type}. Я удалил его, и он работает сейчас.
  • 0
    Почему строка не включена?
Показать ещё 7 комментариев
20

Еще одна вещь, если вы не можете использовать 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}")]
  • 0
    Вы могли бы подумать, что они trim() их после разделения и перед сравнением ... Не обрезка строк, используемых в качестве ключей, - моя главная любимая мозоль, восходящая ко всем моим временам FoxPro.
3

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню