在ASP.NET MVC 4中对Web API操作进行版本控制

YUI*_*per 9 asp.net-mvc-4 asp.net-web-api

我有一个ASP.NET MVC 4应用程序.我想将新的Web API功能用于学习目的.我想学习如何公开相同的端点,但提供不同的版本.换句话说,我想暴露端点,如下所示:

http://mysite/1.0/Products/1
http://mysite/2.0/Products/1
Run Code Online (Sandbox Code Playgroud)

为了做到这一点,我在默认的"Controllers"目录中添加了一个"Api"目录.在"Api"目录中,我还有另外两个目录:"Version1-0"和"Version2-0".每个目录都有一个名为"ProductsController"的ApiController.

我尝试通过在WebApiConfig.cs文件中添加以下路由定义来公开端点:

config.Routes.MapHttpRoute(
  name: "1-0Api",
  routeTemplate: "api/1.0/{controller}/{id}",
  defaults: new { id = RouteParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)

不幸的是,我无法弄清楚如何通过上面列出的URL公开操作.我究竟做错了什么?谢谢!

You*_*oui 7

您可能遇到问题,因为控制器具有相同的名称.控制器命名空间或它所在的文件夹对WebAPI来说根本不重要,只有名称可以.我能想到的最简单的事情是重命名控制器ProductsV1Controller和ProductsV2Controller,并设置两个指向控制器的路径:

config.Routes.MapHttpRoute(
    name: "1-0Api",
    routeTemplate: "api/1.0/Products/{id}",
    defaults: new { controller = "ProductsV1", id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
    name: "2-0Api",
    routeTemplate: "api/2.0/Products/{id}",
    defaults: new { controller = "ProductsV2", id = RouteParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)

当然,如果您想要以这种方式公开多个控制器,这会变得混乱.让我看看我是否想不出更适合你的事情.


mo.*_*mo. 5

Sebastiaan Dammann在他的博客中描述了他如何通过编写自己的实现IHttpControllerSelector和支持接口来进行Web API版本控制.

http://damsteen.nl/blog/implementing-versioning-in-asp.net-web-api

他还将代码放在github上

https://github.com/Sebazzz/SDammann.WebApi.Versioning

并为我们将它打包在NuGet中!:)

https://nuget.org/packages/SDammann.WebApi.Versioning

虽然实现IHttpControllerSelector当然是(imho)进行Web API版本控制的正确方法,但我认为如果他包含基于HTTP Accept头的版本的能力将是理想的(参见http://barelyenough.org/blog/2008/05/版本控制 - 休息 - 网络服务/).

不幸的是我的客户端无法使用Accept标题,所以他RouteVersionedControllerSelector对我来说很理想.

编辑:不确定我是如何错过它的,但确实有一个AcceptHeaderVersionedControllerSelector可以用来做版本化的理想方式.我目前正在一个新项目上使用它,但它仍然有一些缺点