ПомилкаInlineConstraintResolver в 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}")]

"рядок" не потрібен, оскільки це припущений тип, якщо нічого іншого не вказано.

Як вказує на помилку, те, з 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} у своєму атрибуті маршруту. Я її зняв, і вона працює зараз.
Гельсіон

3
@AndreasFurster: Тому що stringне можна застосувати жодних обмежень.
Дейв Новий

31
"рядок" не потрібен, оскільки це припущений тип, якщо нічого іншого не вказано.
Ендрю Єнс,

1
@AndrewGray Цей список доступний тут: asp.net/web-api/overview/web-api-routing-and-action/…
Ілля

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.
DVK

10

Я також отримав цю помилку, коли залишив проміжок між назвою змінної та типом змінної у маршруті, як-от так:

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

Це має бути наступним:

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

1

Я розробив маршрут API для одного методу скасування веб-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.