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

enter image description here

代码

控制器:

[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!";
        });

现在已添加参数。但是很遗憾,没有默认值会自动填充。有人有主意吗?

enter image description here