WebApi 版本控制单个控制器

WebApi versioning a single controller

我才刚刚开始接触 WebApi,我想了解的是,您是否可以拥有 1 个控制器来处理多个版本。

所以不要有 v1/v2 文件夹,其中 v2 在 v1 中有控制器的副本,但 v2 中的逻辑不同于 v1

你能有 1 个控制器来处理所有 api 版本吗?

我在控制器上看到了对 [APiVersion(...)] 属性的引用,但是当我尝试实现我认为正确的东西时,没有调用任何东西

示例:

[ApiVersion("1.0")]
[ApiVersion("2.0")]
[Route("api/v{version:apiVersion}/login")]
public class LoginController : ApiController
{

    [HttpGet]
    [MapToApiVersion("1.0")]
    [Route("login/{username}/{password}")]
    [ResponseType(typeof(LoginResult))]
    public LoginResult GetLoginInfo(string username, string password)
    {
        //v1 logic
    }

    [HttpGet]
    [MapToApiVersion("2.0")]
    [Route("login/{username}/{password}")]
    [ResponseType(typeof(LoginResult))]
    public LoginResult GetLoginInfo2(string username, string password)
    {
        //v2 logic
    }
}

我用这个 answer 作为参考,但它似乎不起作用。使用动作是解决这个问题的方法吗?

理想情况下,我希望能够在调用它的任何地方更改版本号,而不是更改操作名称,但我不知道这是否可能

一种方法是通过将版本直接放在单个控制器的路由中来确保路由不冲突。

public class LoginController : ApiController {

    [HttpGet]
    [Route("~/api/v1/login/{username}/{password}")]
    [ResponseType(typeof(LoginResult))]
    public LoginResult GetLoginInfo(string username, string password) {
        //v1 logic
    }

    [HttpGet]
    [Route("~/api/v2/login/{username}/{password}")]
    [ResponseType(typeof(LoginResult))]
    public LoginResult GetLoginInfo2(string username, string password) {
        //v2 logic
    }
} 

现在如果添加了新版本,只需在路由中包含该版本号即可。

[HttpGet]
[Route("~/api/v3/login/{username}/{password}")]
[ResponseType(typeof(LoginResult))]
public LoginResult GetLoginInfo3(string username, string password) {
    //v3 logic
}

保持简单...