c# – Web Api 2 API不识别路由的多个属性(版本控制)

前端之家收集整理的这篇文章主要介绍了c# – Web Api 2 API不识别路由的多个属性(版本控制)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图从 RoutingConstaints Sample和VersionedRoute实现 RoutingConstaints Sample,但是当我使用控制器时,版本化的属性不再有效.

我需要修改属性才能使其与“属性路由”一起发挥不错?

对于代码示例,下载示例项目(或者只是从上面的链接中查看几个文件),然后修改路由:

  1. // When I use the RoutePrefix,VersionedRoute no longer works (Sending "Api-Version" through http header doesn't route correctly
  2. // If I remove the RoutePrefix I can use VersionedRoute again
  3. // What do I need to change in its code to be able to use both?
  4.  
  5. [VersionedRoute("api/Customers",1)] // This route would be used as http://url/api/customers with a header of "api-version: 1"
  6. [RoutePrefix("api/v1/Customers")] // This route would be used purely through url versioning of http://url/api/v1/Customers
  7. public class CustomersV1Controller : ApiController {
  8.  
  9. /* Other stuff removed */
  10.  
  11. [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.
  12. [Route("")]
  13. public IHttpActionResult Get()
  14. {
  15. return Json(_customers);
  16. }
  17. }

VersionedRoute Code

VersionConstraint Code

编辑:如果您需要更多信息,甚至发布想法或事情尝试,请让我知道:)

编辑2:这是我从Troy Hunt的博客中所做的一个例子:http://www.troyhunt.com/2014/02/your-api-versioning-is-wrong-which-is.html

编辑3:这是我想要的代码尽可能接近,因为它会减少很多的开销和魔术字符串.

  1. [VersionedRoute("api/Customers",1)] // This route would be used as http://url/api/customers with a header of "api-version: 1"
  2. [RoutePrefix("api/v1/Customers")] // This route would be used purely through url versioning of http://url/api/v1/Customers
  3. public class CustomersV1Controller : ApiController {
  4.  
  5. /* Other stuff removed */
  6. [Route("")]
  7. public IHttpActionResult Get()
  8. {
  9. // Removed
  10. return Ok(customers);
  11. }
  12.  
  13.  
  14. [Route("{id:int}")]
  15. public IHttpActionResult GetById(int id)
  16. {
  17. // Removed
  18. return Ok(customer);
  19. }
  20. }
  21.  
  22. [VersionedRoute("api/Customers",2)] // This route would be used as http://url/api/customers with a header of "api-version: 2"
  23. [RoutePrefix("api/v2/Customers")] // This route would be used purely through url versioning of http://url/api/v2/Customers
  24. public class CustomersV2Controller : ApiController {
  25.  
  26. /* Other stuff removed */
  27. [Route("")]
  28. public IHttpActionResult Get()
  29. {
  30. // Removed
  31. return Ok(customersThatAreDifferentThanV1);
  32. }
  33.  
  34.  
  35. [Route("{id:int}")]
  36. public IHttpActionResult GetById(int id)
  37. {
  38. // Removed
  39. return Ok(customerThatIsDifferent);
  40. }
  41. }

编辑:最后的碰撞,尝试只需要在路由上写入路由版本信息一次,在控制器属性级别,而不是每次操作.

解决方法

Route和VersionedRoute属性在一起工作良好,但您的RoutePrefix属性也适用于您的VersionedRoute(尝试访问/ api / v1 / Customers / api / Customer – 您将在api版本头设置时收到响应)

以下代码将会在您的示例中的两个URL中产生所需的行为,以返回正确的响应,但显然这并不能解决您想要在该类顶部有一个VersionedRoute和一个RoutePrefix的问题.为此需要另一种方法.但是,您可以为不同的api版本配置单独的控制器.

  1. [RoutePrefix("api")]
  2. public class CustomersV1Controller : ApiController
  3. {
  4. /* Other stuff removed */
  5.  
  6. [VersionedRoute("Customers",1)]
  7. [Route("v1/Customers")]
  8. public IHttpActionResult Get()
  9. {
  10. return Json(_customers);
  11. }
  12. }

一个改进是创建自己的属性而不是路由,所以你不需要在每个版本前缀:

  1. public class CustomVersionedRoute : Attribute,IHttpRouteInfoProvider
  2. {
  3. private readonly string _template;
  4.  
  5. public CustomVersionedRoute(string route,int version)
  6. {
  7. _template = string.Format("v{0}/{1}",version,route);
  8. }
  9.  
  10. public string Name { get { return _template; } }
  11. public string Template { get { return _template ; } }
  12. public int Order { get; set; }
  13. }
  14.  
  15. [RoutePrefix("api")]
  16. public class CustomersV2Controller : ApiController
  17. {
  18. /* Other stuff removed */
  19.  
  20. [VersionedRoute("Customers",2)]
  21. [CustomVersionedRoute("Customers",2)]
  22. public IHttpActionResult Get()
  23. {
  24. return Json(_customers);
  25. }
  26. }

猜你在找的C#相关文章