Dùng thư viện Asp.Versioning (trước là Microsoft.AspNetCore.Mvc.Versioning).
Đăng ký một lần rồi chọn chiến lược đọc version.
builder.Services.AddApiVersioning(o =>
{
o.DefaultApiVersion = new ApiVersion(1, 0);
o.AssumeDefaultVersionWhenUnspecified = true;
o.ReportApiVersions = true; // adds api-supported-versions header
o.ApiVersionReader = new UrlSegmentApiVersionReader();
}).AddMvc();
[ApiController]
[ApiVersion("1.0")]
[ApiVersion("2.0")]
[Route("api/v{version:apiVersion}/orders")]
public class OrdersController : ControllerBase
{
[HttpGet, MapToApiVersion("2.0")]
public Task<IActionResult> GetV2() => ...;
}Ba chiến lược thường gặp:
- URL segment (/api/v1/orders) — nhìn thấy ngay trong log và analytics, dễ test bằng bất kỳ HTTP client nào; đổi lại URL của cùng một resource thay đổi theo version.
- Query string (/api/orders?api-version=1.0) — mặc định của thư viện, giữ nguyên đường dẫn resource, dễ thêm vào request có sẵn.
- Header (X-Api-Version: 2) — URL sạch nhất, nhưng khó test bằng trình duyệt và dễ bị cache middleware bỏ qua nếu không khai Vary.
Không có lựa chọn đúng tuyệt đối. Thực tế phổ biến nhất là URL segment vì rõ ràng khi vận hành. Đi kèm nên có Deprecated = true trên version cũ và ReportApiVersions để client biết version nào sắp gỡ.