“DefaultInlineConstraintResolver”类型的内联约束解析器无法解析以下内联约束:“apiVersion”
Posted
技术标签:
【中文标题】“DefaultInlineConstraintResolver”类型的内联约束解析器无法解析以下内联约束:“apiVersion”【英文标题】:The inline constraint resolver of type 'DefaultInlineConstraintResolver' was unable to resolve the following inline constraint: 'apiVersion' 【发布时间】:2017-09-30 03:42:47 【问题描述】:我有一个带有默认值控制器的基本 WebApi 实现设置。
在reading a blog about RESTful WebApi Versioning之后我决定将包集成到一个新的WebApi项目中。
我添加了 NuGet 包 Microsoft.AspNet.WebApi.Versioning 来帮助我的 API 版本控制。这是我正在关注的包配置说明的 URL:
https://github.com/Microsoft/aspnet-api-versioning/wiki/Configuring-Your-Application
我的价值观控制器非常简单。我已将装饰添加到我的 Get 方法中。代码如下:
[Authorize]
[ApiVersion("1.0")]
[Route("api/vversion:apiVersion/values")]
public class ValuesController : ApiController
// GET api/values
public IEnumerable<string> Get()
return new string[] "value1", "value2" ;
public string Get(int id)
return "value";
// POST api/values
public void Post([FromBody]string value)
// PUT api/values/5
public void Put(int id, [FromBody]string value)
// DELETE api/values/5
public void Delete(int id)
不幸的是,只要我将以下代码行添加到控制器,整个事情就会爆炸:
[Route("api/vversion:apiVersion/values")]
下面是返回的错误消息:
The inline constraint resolver of type 'DefaultInlineConstraintResolver' was unable to resolve the following inline constraint: 'apiVersion'.
Line 82: GlobalConfiguration.Configure(WebApiConfig.Register);
这是我的 Startup.cs 中的代码
public void Configuration(IAppBuilder app)
// HTTP Configuration
HttpConfiguration config = new HttpConfiguration();
//config.MapHttpAttributeRoutes();
// Configure API Versioning
config.AddApiVersioning();
var constraintResolver = new DefaultInlineConstraintResolver()
ConstraintMap =
["apiVersion"] = typeof( ApiVersionRouteConstraint ) // or mvc routing?
;
config.MapHttpAttributeRoutes(constraintResolver);
// Configure the API to accept token authentication
ConfigureOAuthTokenConsumption(app);
// CORS
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
// Configure the Authorization server
ConfigureOAuth(app);
// Use WebAPI
app.UseWebApi(config);
// Moved from global.asax
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
我认为按照文档中的说明调用 AddApiVersioning 并提供 constraintResolver 可以解决问题,但事实并非如此。现在我正在为下一步做什么而苦苦挣扎。
config.AddApiVersioning();
var constraintResolver = new DefaultInlineConstraintResolver()
ConstraintMap =
["apiVersion"] = typeof( ApiVersionRouteConstraint ) // or mvc routing?
;
config.MapHttpAttributeRoutes(constraintResolver);
有什么建议吗?
【问题讨论】:
【参考方案1】:您应该在 WebApiConfig.cs 文件中解析版本
var constraintResolver = new DefaultInlineConstraintResolver()
ConstraintMap =
["apiVersion"] = typeof( ApiVersionRouteConstraint )
;
config.MapHttpAttributeRoutes(constraintResolver);
在映射路线之前。我的意思是在 config.Routes.MapHttpRoute()
之前【讨论】:
没有WebApiConfig.cs,我用的是OWIN的startup.cs类,并且在映射任何路由之前正在设置约束解析器。 你必须有 ConfigureAuth(app);在 [assembly: OwinStartup(typeof(Owin.Startup))] 类中,您可以转到该类并通过添加 Microsoft.AspNet.WebApi.Versioning nuget 来注入上述代码。 你是对的,现在我只需要尝试弄清楚如何让 Swagger 也能识别路线。感谢您的回答!以上是关于“DefaultInlineConstraintResolver”类型的内联约束解析器无法解析以下内联约束:“apiVersion”的主要内容,如果未能解决你的问题,请参考以下文章