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公开操作.我究竟做错了什么?谢谢!
您可能遇到问题,因为控制器具有相同的名称.控制器命名空间或它所在的文件夹对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)
当然,如果您想要以这种方式公开多个控制器,这会变得混乱.让我看看我是否想不出更适合你的事情.
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 (参见http://barelyenough.org/blog/2008/05/版本控制 - 休息 - 网络服务/).Accept头的版本的能力将是理想的
不幸的是我的客户端无法使用Accept标题,所以他RouteVersionedControllerSelector对我来说很理想.
编辑:不确定我是如何错过它的,但确实有一个AcceptHeaderVersionedControllerSelector可以用来做版本化的理想方式.我目前正在一个新项目上使用它,但它仍然有一些缺点
| 归档时间: |
|
| 查看次数: |
7731 次 |
| 最近记录: |