2017-05-26 189 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 
} 

保持簡單...