API Versioning¶
Installation¶
- Install required NuGet packages
Configuration¶
-
Configure API Versioning
-
Add this before
builder.Services.AddControllers();builder.Services.AddApiVersioning(options => { options.DefaultApiVersion = new ApiVersion(1, 0); options.AssumeDefaultVersionWhenUnspecified = true; // Report supported API versions in response headers options.ReportApiVersions = true; // Versioning strategy (URL-based) options.ApiVersionReader = new UrlSegmentApiVersionReader(); }); -
Optional (recommended): API Explorer for Swagger
-
Usage¶
- Update Controller
Multiple versioning¶
[ApiVersion("1.0")]
[ApiVersion("2.0")]
[Route("api/v{version:apiVersion}/account")]
public sealed class AccountController : ControllerBase
{
[HttpPost("login")]
[MapToApiVersion("1.0")]
public IActionResult LoginV1(...) { }
[HttpPost("login")]
[MapToApiVersion("2.0")]
public IActionResult LoginV2(...) { }
}
Versioning strategies (choose ONE)¶
- URL Segment (recommended)
- Header-based
- Query string
Middleware order (important)
Mark deprecated¶
- Mark API version as deprecated (Controller level)
- v1 still works
- v1 is marked as deprecated
-
v2 is the current version
-
Map actions explicitly (recommended)
-
Enable API version reporting
-
Resulting response headers for v1 requests
-
Optional: Add deprecation warning header (recommended)
-
Add a filter
public sealed class ApiDeprecationHeaderFilter : IActionFilter { public void OnActionExecuting(ActionExecutingContext context) { } public void OnActionExecuted(ActionExecutedContext context) { var apiVersion = context.HttpContext.GetRequestedApiVersion(); if (apiVersion?.MajorVersion == 1) { context.HttpContext.Response.Headers.Add( "Warning", "299 - \"API v1 is deprecated and will be removed in a future release\"" ); } } } -
Register it globally
-
Optional: Swagger deprecation (if you use Swagger)
-
Optional: Hard-block v1 after grace period
-
Option A — remove v1 mapping: the response=> 404 Unsupported API Version
-
Option B — explicit rejection (custom message)
Recommended deprecation timeline
Phase Action Phase 1 Mark deprecated ( Deprecated = true)Phase 2 Add warning headers Phase 3 Notify consumers Phase 4 Block with 410 Gone Phase 5 Remove code