'DefaultInlineConstraintResolver' 类型的内联约束解析器无法解析以下内联约束:'apiVersion'
The inline constraint resolver of type 'DefaultInlineConstraintResolver' was unable to resolve the following inline constraint: 'apiVersion'
我有一个使用默认值控制器的基本 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/v{version: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/v{version: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);
有什么建议吗?
您应该解析 WebApiConfig.cs 文件中的版本
var constraintResolver = new DefaultInlineConstraintResolver()
{
ConstraintMap =
{
["apiVersion"] = typeof( ApiVersionRouteConstraint )
}
};
config.MapHttpAttributeRoutes(constraintResolver);
在映射路线之前。我的意思是在 config.Routes.MapHttpRoute()
之前
当 Type as declared as string 时出现此错误。当我将其更改为 int 时,它开始工作了。
如果您在路由中以 字符串格式 传递数据,则不要使用字符串数据类型,只需在 {} 中写入变量名称即可。
此视频中提供了演示
https://youtu.be/Bc-z9l4HP7Y
我有一个使用默认值控制器的基本 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/v{version: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/v{version: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);
有什么建议吗?
您应该解析 WebApiConfig.cs 文件中的版本
var constraintResolver = new DefaultInlineConstraintResolver()
{
ConstraintMap =
{
["apiVersion"] = typeof( ApiVersionRouteConstraint )
}
};
config.MapHttpAttributeRoutes(constraintResolver);
在映射路线之前。我的意思是在 config.Routes.MapHttpRoute()
之前当 Type as declared as string 时出现此错误。当我将其更改为 int 时,它开始工作了。 如果您在路由中以 字符串格式 传递数据,则不要使用字符串数据类型,只需在 {} 中写入变量名称即可。
此视频中提供了演示 https://youtu.be/Bc-z9l4HP7Y