Я использую ASP.Net Core WebApi, Swashbuckle и Microsoft.AspNetCore.Mvc.Versioning для документирования и управления версиями моего API.
Версионирование пока тоже работает.
Моя проблема:
Сгенерированный документ пользовательского интерфейса Swagger не включает параметры (заголовок запроса или параметр запроса) для определения версии конечной точки. Поэтому, когда я нажимаю Execute в Swagger-Document, для конечной точки выбирается неправильная версия (версия по умолчанию).
Чтобы быть точным:
Swagger выполняет этот запрос: https: // localhost: 5001 / values
Но он должен выполнить этот запрос: https: // localhost: 5001 / values? Api-version = 2.0
Код:
Контроллер:
[ApiController]
[Route("[controller]")]
[SwaggerTag("Gets some values. Have fun with it")]
[ApiVersion("1.0")]
[ApiVersion("2.0")]
public class ValuesController : ControllerBase
{
public ValuesController()
{
}
/// <summary>
/// Gets all values
/// </summary>
/// <remarks>There are values from 1 to 10</remarks>
/// <returns></returns>
[HttpGet]
[SwaggerResponse(200, "Request was successful a list of values was returned", typeof(int[]))]
[MapToApiVersion("1.0")]
public async Task<IActionResult> Get()
{
return Ok(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 });
}
/// <summary>
/// Gets all values
/// </summary>
/// <remarks>There are values from 1 to 20</remarks>
/// <returns></returns>
[HttpGet]
[SwaggerOperation(Tags = new[] { "Values", "Changed Endpoints" })]
[SwaggerResponse(200, "Request was successful a list of values was returned", typeof(int[]))]
[MapToApiVersion("2.0")]
public async Task<IActionResult> Getv2()
{
return Ok(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 });
}
Включить управление версиями:
services.AddApiVersioning(config =>
{
config.DefaultApiVersion = new ApiVersion(1, 0);
config.AssumeDefaultVersionWhenUnspecified = true;
config.ReportApiVersions = true;
config.ApiVersionReader = ApiVersionReader.Combine(new QueryStringApiVersionReader(),
new HeaderApiVersionReader()
{
HeaderNames = { "x-api-version" }
});
});
Включите SwaggerGen:
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("1.0", new OpenApiInfo
{
Title = "API v1.0",
Version = "1.0",
});
c.SwaggerDoc("2.0", new OpenApiInfo
{
Title = "API v1.0",
Version = "1.0",
});
c.EnableAnnotations();
c.IncludeXmlComments(System.IO.Path.Combine(System.IO.Directory.GetCurrentDirectory(), "wwwroot", "OpenApi.xml"));
c.DocInclusionPredicate((docName, apiDesc) =>
{
if (!apiDesc.TryGetMethodInfo(out MethodInfo methodInfo)) return false;
var versions = methodInfo.GetCustomAttributes(true)
.OfType<Microsoft.AspNetCore.Mvc.MapToApiVersionAttribute>()
.SelectMany(attr => attr.Versions).ToList();
return versions.Any(v => v.ToString() == docName);
});
});
Кто-нибудь может мне помочь?