Я создаю Web API в ASP. NET Core и экспериментирую с несколькими версиями. Я создаю документы Swagger для каждой версии, следуя этим инструкциям: https://github.com/domaindrivendev/Swashbuckle.AspNetCore/blob/master/README.md#customize -the-action-selection-process
У меня есть 2 версии одного и того же действия, определенного так:
namespace Web.Api
{
[ApiController]
[Area("api")]
[Route("[area]/[controller]")]
public abstract class MyApiControllerBase : ControllerBase
{
}
}
namespace Web.Api.V1
{
public class TestController : MyApiControllerBase
{
[HttpGet]
[ApiVersion("1.0")]
public IActionResult Get()
{
return Ok("Version 1.0 endpoint.");
}
}
}
namespace Web.Api.V2
{
public class TestController : MyApiControllerBase
{
[HttpGet]
[ApiVersion("2.0")]
public IActionResult Get()
{
return Ok("Version 2.0 endpoint.");
}
}
}
И мой Swagger Gen настроен следующим образом в Startup.cs
:
services.AddSwaggerGen(options =>
{
options.DocInclusionPredicate((docName, apiDesc) =>
{
if (!apiDesc.TryGetMethodInfo(out MethodInfo methodInfo))
{
return false;
}
IEnumerable<ApiVersion> versions = methodInfo.DeclaringType
.GetCustomAttributes(true)
.OfType<ApiVersionAttribute>()
.SelectMany(a => a.Versions);
return versions.Any(v => $"v{v.ToString()}" == docName);
});
options.SwaggerDoc("v1.0", new OpenApiInfo { Title = "My API", Version = "v1.0" });
options.SwaggerDoc("v2.0", new OpenApiInfo { Title = "My API", Version = "v2.0" });
});
Однако, когда я посещаю мой Swagger UI, он говорит: «В spe c не определены операции!» как для v1.0, так и для v2.0. Если я проверяю DocInclusionPredicate
при загрузке Swagger, то делаем c, кажется, что атрибут ApiVersion
не берется, и поэтому объясняет, почему они не включены в документы. Например, когда Web.Api.V2.TestController.Get
передается в качестве аргумента apiDesc
, это то, что найдено для атрибутов:
Атрибуты
Только ApiControllerAttribute
, AreaAttribute
, RouteAttribute
и ControllerAttribute
найдены. Все это атрибуты базовых классов, а не непосредственно самого действия TestController
или Get()
.