WebAPI 2 中的 DefaultInlineConstraintResolver 错误

Posted

技术标签:

【中文标题】WebAPI 2 中的 DefaultInlineConstraintResolver 错误【英文标题】:DefaultInlineConstraintResolver Error in WebAPI 2 【发布时间】:2014-06-18 04:28:35 【问题描述】:

我正在使用 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 请求。

【问题讨论】:

【参考方案1】:

错误意味着在 Route 的某个地方,您指定了类似的内容

[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) 

【讨论】:

我看到错误是有道理的。我的路由属性中有 string:type 。我删除了它,它现在可以工作了。 @AndreasFurster:因为string 不能应用任何约束。 "string" 不需要,因为它是假定的类型,如果没有指定其他内容。 @AndrewGray 此列表可在此处获得:asp.net/web-api/overview/web-api-routing-and-actions/… 如果问题是因为路由属性如:string:type,只需删除'string:'【参考方案2】:

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

【讨论】:

你会认为他们会在拆分之后和进行比较之前trim()这些......不修剪用作键的字符串是我一直回想起我的 FoxPro 的主要烦恼天。【参考方案3】:

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

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

应该是这样的:

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

【讨论】:

【参考方案4】:

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

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

基本上你只是不指定类型

【讨论】:

【参考方案5】:

我为一个 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 约束,您必须使用 IHttpRouteConstraint 创建自定义 OrderCorrectionEnumRouteConstraint

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 了解更多详情

【讨论】:

【参考方案6】:

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

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

【讨论】:

以上是关于WebAPI 2 中的 DefaultInlineConstraintResolver 错误的主要内容,如果未能解决你的问题,请参考以下文章

模型绑定不适用于 ASP.NET Core 2 WebAPI 中的 POST 请求

在 c# (Unity) 中解析 JSON 文件

HTTP post请求中的多个参数不在Asp.net webApi 2.0中绑定

WebApi 2 超出最大请求长度

RESTful架构中的webapi

2-2 Consul注册注销流程