【发布时间】:2011-08-21 09:03:19
【问题描述】:
我最初的问题是我正在寻找在 Restful API 中进行版本控制的最佳实践。没有多少人谈论这个,没有一个好的答案,或者我目前无法找到确切的解决方案。
(1) 起初我想为每个版本http://domain.com/API/{version} 使用Tag 或Branch。因此,如果新的 API 发布,我 Tag 它会导出并发布到相应的 URL,但似乎很难在一个 Web 应用程序中混合不同版本的源代码。
(2) 然后我想用这种方式,一个控制器一个版本: (就像这个问题Versioning of REST API Built With ASP.NET MVC 3 - Best Practices)
http://domain.com/API/1.0/{AnAction} => will go to APIV1Controller.{AnAction}
http://domain.com/API/2.0/{AnAction} => will go to APIV2Controller.{AnAction}
但它需要为每个版本写一个路由。
(3) 第三种方法是我从 PayPal API 获得的想法,即版本不在 URL 中,而是在 POST 参数中。因此 URL 固定为http://domain.com/API/,但用户必须指定Version 参数才能具有"1.0" 或"2.0"。
解决方案:(2) 对我来说没问题,目前我使用这种方式,但我想混合使用 (2) 和 (3),所以我有一个 APIController,它只有一个索引操作来检查这个Version 参数并将请求传输到相应的控制器和操作 APIV1Controller.{AnAction} 或 APIV2Controller.{AnAction}。
在谷歌搜索和 Stackoverflowing 之后,了解如何在没有重定向的情况下传输、调用或调用另一个控制器和操作。似乎没有好的答案和好的做法。有人通过简单地创建控制器的新实例来回答.NET MVC Call method on different controller。突然间我想到了reroute!
问题:
是否可以 reroute 另一个控制器和另一个动作中的动作而无需重定向以及如何做到这一点?
或者一个具体的问题,当用户请求http://domain.com/API/{AnAction}和Version="2.0"时,我如何将reroute从APIController.Index变成APIV2Controller.{AnAction}?
我没有使用 IoC。
【问题讨论】:
-
好像没有办法?
标签: asp.net-mvc asp.net-mvc-3 rest asp.net-web-api