WebApi版本控制单个控制器

时间:2017-05-26 18:51:42

标签: c# asp.net-web-api asp.net-web-api-routing

我刚刚开始进入WebApi而我想要了解的是,如果你有一个控制器可以处理多个版本。

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

你能拥有一台能够处理所有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作为参考,但它似乎不起作用。使用动作是解决这个问题的方法吗?

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

1 个答案:

答案 0 :(得分:1)

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

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
}

保持简单......