我正在实施 Web API 版本控制,如下所示Web API 版本控制 http://www.codeproject.com/Articles/741326/Introduction-to-Web-API-Versioning。我的控制器位于 2 个独立的命名空间中,并且我使用了自定义 SelectController 方法来根据查询参数选择要使用的版本。
例如
http://myapi/api/values?version=1.0
这一切都工作正常,但控制器中的某些操作使用 Route 属性
[Route("api/values/getNames")]
public HttpResponseMessage Get() { ... }
默认情况下,它们映射到正确的控制器
config.MapHttpAttributeRoutes();
在WebApiConfig.cs中
如果我有多个版本的 API 具有相同的路由,这将不起作用。我是否能够为 config.MapHttpAttributeRoutes() 提供自定义实现,以便我可以选择要使用的正确 API 版本,或者是否有更好的方法?
官方有一个例子Codeplex 上的 WebApi 2.1 示例 http://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/RoutingConstraintsSample/ReadMe.txt。
它依赖于请求标头值来存储版本。
我认为它好多了,因为它允许所有版本的路线保持相同。客户端只需在请求中包含 HTTP 标头(在本例中为版本号)即可选择版本。
此示例展示了如何在中使用属性路由和约束
ASP.NET Web API 通过“api-version”动态过滤控制器
HTTP 标头。当路由使用约束时,每个约束都有一个
有机会阻止路由匹配给定的请求。在这个
示例,自定义 RouteFactoryAttribute (VersionedRoute) 添加了
对每个属性路由的约束。
...
自定义约束实现(VersionConstraint)是
基于匹配整数的“api-version”值实现
价值。提供了约束的允许版本的值
通过放置在每个控制器上的 VersionedRoute 属性。当一个
请求进来,'api-version' 的 header 值被匹配
预期的版本。此示例使用标头但有约束
实施可以使用任何标准来决定请求是否是
对路线有效。
无论如何,最终结果将如下所示:
[VersionedRoute("api/Customer", 1)]
public class CustomerVersion1Controller : ApiController
{
// controller code goes here
}
[VersionedRoute("api/Customer", 2)]
public class CustomerVersion2Controller : ApiController
{
// controller code goes here
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)