【发布时间】:2021-11-20 21:13:34
【问题描述】:
我们的产品是一个client/server 应用程序,它在现场拥有多个版本的客户端,但只有一台运行最新版本的服务器来为所有API 调用提供服务。我们有/将有数百个API 端点,我正在尝试如何最好地处理版本控制。我想做的是能够避免将attributes 应用于每个方法的繁重任务,或者每次我们进行微小更改时复制整个控制器。
我可能会误解大多数关于此的文档/实践,但似乎每次您碰到API 时,您都必须经历并完成所有这些工作,这似乎充其量是低效的。
相反,我想做的是将attribute 应用到每个端点,并使用编写时的版本,然后客户端会找到最接近的版本等于或小于客户端版本。
例如,如果端点被写入[ApiVersion("1.0")],那么这就是它获得的属性。如果我们必须修改它,我会复制该方法,重命名它,应用RoutePrefix attribute 以便正确命中并使用我们整个API 的版本应用一个新的attribute(在这个例子中我输入了1.5)。
这是一个简单的例子:
[HttpGet]
[ApiVersion("1.0")]
[Route("GetHeartBeat")]
public bool GetHeartBeat()
{
return true;
}
[HttpGet]
[ApiVersion("1.5")]
[Route("GetHeartBeat")]
public bool GetHeartBeat2()
{
return false;
}
当我使用 url 版本控制时,这没有问题:
-
/api/v1.0/GetHeartBeat或 /api/v1.5/GetHeartBeat
但/api/v1.3/GetHeartBeat 不存在,因为该版本不存在..
我想要发生的是,如果我有一个运行1.3 的客户端,那么它将找到等于或小于最新版本的最接近的版本。所以/api/v1.3/GetHeartBeat 会被接收,因为1.3 不存在,那么它会查看最接近/更早的版本,在这种情况下是1.0。
我可以编写一堆路由逻辑来完成这个,但我觉得必须有一个开箱即用的解决方案,因为我不能成为第一个尝试这个的人。有没有一个nuget 包可以实现这个?
【问题讨论】:
-
我不认为一个属性对你有任何好处,但是一个中间件可能会有所帮助,如果你用
IActionDescriptorCollectionProvider注入它,你可以检查一个路由是否存在,然后降级直到你找到一个匹配的路由
标签: c# asp.net api-versioning aspnet-api-versioning