How can versioning be done in ASP.NET Core Web Api

后端 未结 4 1663
耶瑟儿~
耶瑟儿~ 2020-12-25 09:10

In previous asp.net web api, I implement DefaultHttpControllerSelector to specify how I want the request to locate my controller. I often have diff

4条回答
  •  半阙折子戏
    2020-12-25 09:44

    This is a very old question that I stumbled upon, but there are much better solutions now. There is this package

    Microsoft.AspNetCore.Mvc.Versioning

    Which has a much more feature rich way of implementing versioning controls. These include being able to use URL query strings, url paths, headers, or custom version readers. Being able to read the version from HTTPContext etc.

    In short, you add the following into your ConfigureServices method in startup.cs

    services.AddApiVersioning(o => {
        o.ReportApiVersions = true;
        o.AssumeDefaultVersionWhenUnspecified = true;
                o.DefaultApiVersion = new ApiVersion(1, 0);
    });
    

    Then you have to decorate your controllers with an ApiVersion.

    [ApiVersion("1.0")]
    [Route("api/home")]
    public class HomeV1Controller : Controller
    {
        [HttpGet]
        public string Get() => "Version 1";
    }
    
    [ApiVersion("2.0")]
    [Route("api/home")]
    public class HomeV2Controller : Controller
    {
        [HttpGet]
        public string Get() => "Version 2";
    }
    

    You can also implement it in the path by putting it in the route.

    [ApiVersion("1.0")]
    [Route("api/{version:apiVersion}/home")]
    public class HomeV1Controller : Controller
    {
        [HttpGet]
        public string Get() => "Version 1";
    }
    
    [ApiVersion("2.0")]
    [Route("api/{version:apiVersion}/home")]
    public class HomeV2Controller : Controller
    {
        [HttpGet]
        public string Get() => "Version 2";
    }
    

    When you go down this method of actually having it implemented via the Microsoft package, it also means that you are able to deprecate versions, have version discovery, access the version number from the HttpContext easily etc. None of which you could really do if it's just hardcoded in your route.

    For more info (Including using it in a header) :

    • http://dotnetcoretutorials.com/2017/01/17/api-versioning-asp-net-core/

    • http://www.hanselman.com/blog/ASPNETCoreRESTfulWebAPIVersioningMadeEasy.aspx

    • https://github.com/Microsoft/aspnet-api-versioning/wiki

提交回复
热议问题