WebAPI 2中的DefaultInlineConstraintResolver错误


140

我正在使用Web API 2,并且在本地机器上使用IIS 7.5将POST发送到API方法时收到以下错误。

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

Line 21: GlobalConfiguration.Configuration.EnsureInitialized();

我的API都无法使用IIS。但是,我可以使用IIS Express在Visual Studio中运行我的API项目,并成功对我的登录API进行POST,但是当我尝试对另一个API调用提出GET请求时,出现约束解析器错误。

为了解决此问题,我在Visual Studio中创建了一个全新的Web API 2项目,并开始一次将现有API导入到新项目中并运行它们以确保它们能正常工作。将IIS Express与该新项目一起使用,可以获得与现有API项目相同的精确结果。

我在这里想念什么?即使使用一个全新的项目,如果不遇到此约束解析器问题,我也无法发出GET请求。

Answers:


279

该错误意味着您在某条路线中指定了类似

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

不需要“字符串”,因为如果没有其他说明,则为假定的类型。

如错误所指示,DefaultInlineConstraintResolverWeb 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
这就是为什么我看到错误的原因。我的route属性中有{string:type}。我删除了它,现在可以正常工作了。
太平2014年

3
@AndreasFurster:因为string不能应用任何约束。
Dave New

31
不需要“字符串”,因为如果没有其他说明,则为假定的类型。
安德鲁·詹斯


2
如果问题是因为路由属性,如:{string:type},只需删除“ string:”
Asaf 2015年

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

我为一种Undo Web 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

当类型声明为字符串时出现此错误。当我将其更改为int时,它开始工作

[HttpGet][Route("testClass/master/{Type:string}")]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.