Со временем в конечные точки апи требуется внести изменения ломающие работу клиентов, которые обращаются к этому апи. Чтобы дать время клиентам избежать ситуации при которой работа их приложений ломается при каждом критическом изменении - следует учитывать этот фактор при проектировании апи. В частности одним из таких способов это выпуск новой версии при каждом изменении контракта, а также поддержание устаревших конечных точек еще какое то время после выпуска новой версии. В идеале такие конечные точки должны поддерживаться до тех пор пока статистика показывает, что к конечным точкам все еще обращаются клиенты.
Данные расширение также влияет на отображение в Swagger.
Настройка
Добавим пакет Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer:
dotnet add Microsoft.AspNetCore.Mvc.Versioning.ApiExplorerСоздадим расширение настройки версионности контроллеров
Создадим Extensions для настройки версионности контроллеров. В моем случае это файл DependencyInjection/ApiVersioning.cs в основном проекте Asp.net:
public static class ApiVersioning
{
public static IServiceCollection ConfigureApiVersioning(
this IServiceCollection services
) => services
.AddApiVersioning(config =>
{
config.DefaultApiVersion = new ApiVersion(1, 0);
config.AssumeDefaultVersionWhenUnspecified = true;
config.ReportApiVersions = true;
})
.AddVersionedApiExplorer(
options =>
{
options.GroupNameFormat = "'v'VVV";
options.SubstituteApiVersionInUrl = true;
}
);
}Подключим версионность через зависимости
В Program.cs:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.ConfigureApiVersioning();
var app = builder.Build();
app.UseHttpsRedirection();
app.MapControllers();
app.Run();Пример контроллера
Создадним контроллер с определенной версией Controllers/v1/UserController.cs:
using Microsoft.AspNetCore.Mvc;
namespace WebApi.Controllers.v1;
[ApiVersion("1")]
[Route("api/v{version:apiVersion}/users")]
[ApiController]
public class UserController : Controller
{
...
}