【发布时间】:2019-01-10 01:25:24
【问题描述】:
首先,一点免责声明:我已经在aspnet-api-versioning repo 上为此创建了一个 GitHub 问题。这个问题的内容和那个github issue的内容基本一致。
我在 .NET 4.5.2 上使用 ASP.NET Web API。
我的示例 API 如下所示:
namespace App.Backend.Controllers.Version1
{
[ApiVersion("1.0")]
public class SomeController: ApiController
{
[HttpGet]
[Route("api/entity/{id:int:min(1)}")]
public async Task<IHttpActionResult> ApiAction(int id) //Already running in production
{
//Accessible by using ?api-version=1.0 OR by omitting that since this is the default version
return Ok();
}
}
}
namespace App.Backend.Controllers.Version2
{
[ApiVersion("2.0")]
public class SomeController : ApiController
{
[HttpGet]
[Route("api/entity/{id:int:min(1)}")]
public async Task<IHttpActionResult> ApiAction(int id)
{
//Accessible by using ?api-version=2.0 OR by omitting that since this is the default version
return Ok();
}
}
}
配置如下:
// Add versioning
config.AddApiVersioning(o =>
{
o.AssumeDefaultVersionWhenUnspecified = true;
o.DefaultApiVersion = new ApiVersion(1, 0);
});
但是,当我发送请求时,会发生以下情况:
System.InvalidOperationException: A route named 'RegisterHours' is already in the route collection. Route names must be unique.
重复:
api/some/ApiAction
api/some/ApiAction
这对我来说很奇怪,因为在 wiki there is an example 完全是就像我的情况
我想使用?api-version={version} 选项,但看起来我现在别无选择使用 URL 路径版本(api/v1.0/some/apiAction 和 api/v2.0/some/apiAction。如果这是真的,我想我必须添加另一个路由到每个现有的操作都会像 api/v{version:apiVersion}/controller/action 一样允许他们使用 v1.0 以便在整个应用程序中统一?
你们有什么建议?我猜我可以在 API 版本 2 的 URL 中使用 /v2.0/,但我更喜欢查询字符串版本。
【问题讨论】:
标签: c# asp.net rest asp.net-web-api versioning