【发布时间】:2014-12-06 02:40:52
【问题描述】:
我正在尝试从RoutingConstaints Sample 实现Attribute Routing 和VersionedRoute,但是当我在控制器上同时使用它们时,版本化属性不再起作用。
我需要对属性进行哪些修改才能使其与属性路由搭配得很好?
对于代码示例,请下载示例项目(或仅查看上面链接中的几个文件),然后按如下方式修改路由:
// When I use the RoutePrefix, VersionedRoute no longer works (Sending "Api-Version" through http header doesn't route correctly
// If I remove the RoutePrefix I can use VersionedRoute again
// What do I need to change in its code to be able to use both?
[VersionedRoute("api/Customers", 1)] // This route would be used as http://url/api/customers with a header of "api-version: 1"
[RoutePrefix("api/v1/Customers")] // This route would be used purely through url versioning of http://url/api/v1/Customers
public class CustomersV1Controller : ApiController {
/* Other stuff removed */
[VersionedRoute("api/Customer", 1)] // I'd rather not have to use this here at all and just use a single one on the class, but having both nor just one on either works right now.
[Route("")]
public IHttpActionResult Get()
{
return Json(_customers);
}
}
编辑:如果您需要更多信息或发布想法或尝试的东西,请告诉我:)
Edit2:这是我在 Troy Hunt 的博客中尝试做的一个示例:http://www.troyhunt.com/2014/02/your-api-versioning-is-wrong-which-is.html
Edit3:这是我希望编码尽可能接近的内容,因为它会减少很多开销和魔术字符串。
[VersionedRoute("api/Customers", 1)] // This route would be used as http://url/api/customers with a header of "api-version: 1"
[RoutePrefix("api/v1/Customers")] // This route would be used purely through url versioning of http://url/api/v1/Customers
public class CustomersV1Controller : ApiController {
/* Other stuff removed */
[Route("")]
public IHttpActionResult Get()
{
// Removed
return Ok(customers);
}
[Route("{id:int}")]
public IHttpActionResult GetById(int id)
{
// Removed
return Ok(customer);
}
}
[VersionedRoute("api/Customers", 2)] // This route would be used as http://url/api/customers with a header of "api-version: 2"
[RoutePrefix("api/v2/Customers")] // This route would be used purely through url versioning of http://url/api/v2/Customers
public class CustomersV2Controller : ApiController {
/* Other stuff removed */
[Route("")]
public IHttpActionResult Get()
{
// Removed
return Ok(customersThatAreDifferentThanV1);
}
[Route("{id:int}")]
public IHttpActionResult GetById(int id)
{
// Removed
return Ok(customerThatIsDifferent);
}
}
编辑:最后一次碰撞,试图只在控制器属性级别而不是每个操作上为每个路由写入一次路由版本信息。
【问题讨论】:
-
你到底想做什么?
-
@DavidG 我正在尝试同时使用
VersionedRoute("Customer", 1),这将允许我使用http 标头来提供版本#,以及使用RoutePrefix("v1/Customer/")通过url 进行版本控制。基本上我想同时支持标头和 url 版本控制。但是,当我应用RoutePrefix时,VersionedRoute属性停止工作。 -
设置项目时您的配置是什么样的?
-
@entropic 完整项目链接在 OP 中:aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/…
-
@John 这篇文章提到了
Route,但没有提到RoutePrefix,但是在 cmets 中有人提出了一个潜在的解决方案。
标签: c# asp.net asp.net-web-api versioning asp.net-web-api2