2017-05-26 190 views
2

我刚开始进入WebApi,我想了解的是如果您可以有1个控制器可以处理多个版本。WebApi版本化单个控制器

因此而不必在那里V2拥有控制器的副本V1,但V2的逻辑是从V1

不同v1/v2文件夹,你可以有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作为参考,但它似乎没有工作。正在用行动来解决这个问题吗?

理想我只想能够在任何地方更改版本号,它被调用,而不是改变动作的名称,但我不知道这是可能的

回答

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 
} 

保持简单...