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