讓專案的API可以藉由版本號區分,讓兩種版本並且同名的API可以同時並行,讓使用者可以自行選擇要使用的API版本,避免新API為了兼容舊使用者,無法做大幅度的設計/架構改動。
安裝 Nuget package
dotnet add package Microsoft.AspNetCore.Mvc.Versioning
在Startup加上設定
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddApiVersioning(options =>
{
options.DefaultApiVersion = new ApiVersion(1, 0);
options.AssumeDefaultVersionWhenUnspecified = true;
options.ReportApiVersions = true;
options.ApiVersionReader = new QueryStringApiVersionReader("ver");
});
}
QuertString
為 Api 加上 ApiVersionAttribute
[ApiController]
[Route("My/[action]")]
public class MyController : ControllerBase
{
[ApiVersion("1.0")]
[HttpGet]
public string Get()
{
return "1.0";
}
}
[ApiController]
[Route("My/[action]")]
public class My2Controller : ControllerBase
{
[ApiVersion("2.0")]
[HttpGet]
public string Get()
{
return "2.0";
}
}
測試三種情況



如果把前面的 AssumeDefaultVersionWhenUnspecified 改成 false,再試一次不指定版本的方式,會返回錯誤訊息

Route
在 Route 指定參數並搭配 RouteConstraintName(預設為apiVersion)
[ApiController]
[ApiVersion("1.0")]
[Route("My/v{version:apiVersion}/[action]")]
public class MyController : ControllerBase
{
[HttpGet]
public string Get()
{
return "1.0";
}
}
[ApiController]
[ApiVersion("2.0")]
[Route("My/v{version:apiVersion}/[action]")]
public class My2Controller : ControllerBase
{
[HttpGet]
public string Get()
{
return "2.0";
}
}
接著就可以從 Route 指定 Version


GitHub aspnet-api-versioning
安裝 Nuget package
在Startup加上設定
public void ConfigureServices(IServiceCollection services) { services.AddControllers(); services.AddApiVersioning(options => { // 預設的API版本 options.DefaultApiVersion = new ApiVersion(1, 0); // 是否在未指定版本時使用預設版本 options.AssumeDefaultVersionWhenUnspecified = true; // 在response header顯示該api支援的版本 options.ReportApiVersions = true; // 指定從queryString取得版本號的參數(預設是api-version) options.ApiVersionReader = new QueryStringApiVersionReader("ver"); }); }
QuertString
為 Api 加上 ApiVersionAttribute
[ApiController] [Route("My/[action]")] public class MyController : ControllerBase { [ApiVersion("1.0")] [HttpGet] public string Get() { return "1.0"; } } [ApiController] [Route("My/[action]")] public class My2Controller : ControllerBase { [ApiVersion("2.0")] [HttpGet] public string Get() { return "2.0"; } }
測試三種情況
如果把前面的 AssumeDefaultVersionWhenUnspecified 改成 false,再試一次不指定版本的方式,會返回錯誤訊息
Route
在 Route 指定參數並搭配 RouteConstraintName(預設為apiVersion)
[ApiController] [ApiVersion("1.0")] [Route("My/v{version:apiVersion}/[action]")] public class MyController : ControllerBase { [HttpGet] public string Get() { return "1.0"; } } [ApiController] [ApiVersion("2.0")] [Route("My/v{version:apiVersion}/[action]")] public class My2Controller : ControllerBase { [HttpGet] public string Get() { return "2.0"; } }
接著就可以從 Route 指定 Version
GitHub aspnet-api-versioning