我正在使用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请求。
答案 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) { ... }
基本上,您只是不指定类型