Web API 2中的DefaultInlineConstraintResolver错误

时间:2014-05-01 16:30:54

标签: c# asp.net api iis asp.net-web-api

我正在使用Web API 2,当我在本地方框中使用IIS 7.5向我的API方法发送POST时,我收到以下错误。

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请求。

6 个答案:

答案 0 :(得分:229)

错误意味着在路线的某个地方,您指定了类似

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

不需要“string”,因为如果没有指定其他内容,它是假定的类型。

如错误所示,Web API附带的DefaultInlineConstraintResolver没有名为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) }

答案 1 :(得分:29)

如果您不能使用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}")]

答案 2 :(得分:8)

当我在路径中的变量名和变量类型之间留下空格时,我也遇到了这个错误,如下所示:

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

应该如下:

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

答案 3 :(得分:0)

当Type声明为string时,我收到此错误。当我将其更改为int时,它开始工作

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

答案 4 :(得分:0)

我为一种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了解更多详情

答案 5 :(得分:0)

您可以通过以下方式将字符串作为类型

[HttpGet]
[Route("users/{name}")]
public User GetUserByName(string name) { ... }

基本上,您只是不指定类型