2017-05-26 6 views
2

私はちょうどWebApiに入るようになっています。複数のバージョンを扱う1つのコントローラを持つことができれば、私が理解しようとしていることがあります。WebApiが単一のコントローラをバージョン管理する

ので代わりv2はv1の中で、コントローラのコピーを持っていますが、V2内のロジックが

v1とは異なっているv1/v2フォルダを持っていることの何がすべてのAPIのバージョンを処理する1つのコントローラを持つことができますか?

私は、コントローラ上の[APiVersion(...)]属性への参照を見たが、私は私が考えたものを実装しようとすると、

例に呼び出される権利は何もありませんしている:私は参照として本answerを使用しますが

[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 
    } 
} 

それ動作していないようです。これを解決するために行動を使用していますか?

理想的には、私はちょうどどこでもそれはアクション名を変更する代わりに呼び出されることにバージョン番号を変更できるようにしたいと思いますが、私はそれが可能かどう

答えて

1

一つのアプローチは、念のためかもしれないがわかりませんルートを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 
} 

...それをシンプルに保ちます
関連する問題