WebAPI 2中的 DefaultInlineConstraintResolver 错误

我正在使用 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 一次一个地导入到新项目中,并运行它们以确保它们能够正常工作。在这个新项目中使用 IISExpress,我得到的结果与我在现有 API 项目中得到的结果完全相同。

我错过了什么?即使是一个全新的项目,我也不能在不遇到这个约束解析器问题的情况下发出 GET 请求。

58372 次浏览

该错误意味着您在 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) }

还有一件事,如果你不能使用 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}")]

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

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

应该是这样的:

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

当 Type 声明为 string 时,我得到了这个错误。当我将其改为 int 时,它就开始工作了

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

我为一个 Undo Web API 方法设计了一个 API 路由,并试图对路由中的操作应用 ENUM 数据类型验证,在 DefaultInlineConstrainResolver Error 下面遇到了这个问题

错误: 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了解更多细节

按照以下方式获取字符串作为类型

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

基本上你只是不指定类型