【问题标题】:DefaultInlineConstraintResolver Error in WebAPI 2WebAPI 2 中的 DefaultInlineConstraintResolver 错误
【发布时间】: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 请求。

【问题讨论】:

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


    【解决方案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}")]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-03-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-01-12
            • 2015-06-06
            • 1970-01-01
            相关资源
            最近更新 更多