我正在ASP.NET Core中构建Web API,并正在尝试使用多个版本。我正在按照以下说明为每个版本创建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时,它说“规范中未定义任何操作!”对于v1.0和v2.0。如果我在加载Swagger文档时检查了DocInclusionPredicate
,似乎没有选择ApiVersion
属性,因此解释了为什么它们不包含在文档中。例如,当将Web.Api.V2.TestController.Get
作为参数apiDesc
传递时,这就是对属性的发现:
仅找到ApiControllerAttribute
,AreaAttribute
,RouteAttribute
和ControllerAttribute
。所有这些都是基类上的属性,而不是直接在TestController
或Get()
动作本身上。
答案 0 :(得分:0)
对于asp.net core 3.0,您可以按照以下步骤操作:
1。安装Swashbuckle.AspNetCore 5.0.0
2。安装Microsoft.AspNetCore.Mvc.Versioning 4.0.0
3。安装Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer 4.0.0
4。像下面那样更改控制器({{1}需要在控制器上声明):
ApiVersion
5.Startup.cs(请注意,您需要使用[Route("api/v{version:apiVersion}/[controller]")]
[ApiVersion("1.0")]
public class TestController : MyApiControllerBase
{
[HttpGet]
public IActionResult Get()
{
return Ok("Version 1.0 endpoint.");
}
}
[Route("api/v{version:apiVersion}/[controller]")]
[ApiVersion("2.0")]
public class TestController : MyApiControllerBase
{
[HttpGet]
public IActionResult Get()
{
return Ok("Version 2.0 endpoint.");
}
}
并设置services.AddVersionedApiExplorer
来告诉swagger替换控制器路由中的版本并配置api版本:):
options.SubstituteApiVersionInUrl=true