如何解决Swashbuckle + ASP.Net Core WebApi:Swagger文档是否不包含用于版本选择的Request-Header或QueryParameter?
我使用ASP.Net Core WebApi,Swashbuckle和Microsoft.AspNetCore.Mvc.Versioning来记录和版本化我的API。
到目前为止,版本控制也可以使用。
我的问题:
生成的Swagger UI文档不包含用于确定端点版本的参数(Request-Header或Query Parameter)。因此,当我在Swagger文档中按“执行”时,为端点选择了错误的版本(默认版本)。
准确地说:
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,typeof(int[]))]
[MapToApiVersion("2.0")]
public async Task<IActionResult> Getv2()
{
return Ok(new int[] { 1,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",});
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);
});
});
有人可以帮我吗?
解决方法
通过添加以下内容解决了此问题:
services.AddVersionedApiExplorer(options =>
{
options.GroupNameFormat = "'v'VVV";
options.DefaultApiVersion = new ApiVersion(1,0);
options.AssumeDefaultVersionWhenUnspecified = true;
options.DefaultApiVersionParameterDescription = "Do NOT modify api-version!";
});
现在已添加参数。但是很遗憾,没有默认值会自动填充。有人有主意吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。