当前位置: 首页 > 知识库问答 >
问题:

大摇大摆的版本控制不起作用。它显示所有endpoint,不管所选的API版本如何

宰修能
2023-03-14

namespace Application.Controllers
{
    [ApiVersion("1")]
    [ApiVersion("2")]
    [ApiController]
    [Route("api/v{version:apiVersion}")]
    public class CustomController: ControllerBase
    {
        [HttpGet]
        [Route("result")]
        public IActionResult GetResult()
        {
            return Ok("v1")
        }

        [HttpGet]
        [MapToApiVersion("2")]
        [Route("result")]
        public IActionResult GetResult(int number)
        {
            return Ok("v2")
        }
    }
}
            services.AddApiVersioning(
                options =>
                {
                    options.ReportApiVersions = true;
                });

            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc($"v1", new OpenApiInfo { Title = "api1", Version = $"v1" });

                c.SwaggerDoc($"v2", new OpenApiInfo { Title = "api2", Version = $"v2" });         
         

                c.OperationFilter<RemoveVersionParameterFilter>();
                c.DocumentFilter<ReplaceVersionWithExactValueInPathFilter>();
                c.EnableAnnotations();
            });
app.UseSwagger().UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint($"/swagger/v1/swagger.json", $"api1 v1");
                c.SwaggerEndpoint($"/swagger/v2/swagger.json", $"api2 v2");
            });

加载后,我得到一个错误:Fetch error undefined/swagger/v1/swagger.json但是如果我将第二条路由更改为“resutltwo”,我可以在swagger中观察到两个endpoint,忽略当前版本(api1 v1或api2 v2)

如何才能在每个API版本中只看到1个endpoint?

共有1个答案

松德曜
2023-03-14

谢谢咆哮S的帮助!

我刚加了一句

 services.AddApiVersioning(apiVersioningOptions =>
            {
                apiVersioningOptions.ReportApiVersions = true;
                apiVersioningOptions.ApiVersionReader = new UrlSegmentApiVersionReader();
            });

 c.DocInclusionPredicate((version, desc) =>
                {
                    var endpointMetadata = desc.ActionDescriptor.EndpointMetadata;

                    if (!desc.TryGetMethodInfo(out MethodInfo methodInfo))
                    {
                        return false;
                    }

                    var specificVersion = endpointMetadata
                            .Where(data => data is MapToApiVersionAttribute)
                            .SelectMany(data => (data as MapToApiVersionAttribute).Versions)
                            .Select(apiVersion => apiVersion.ToString())
                            .SingleOrDefault();

                    if (!string.IsNullOrEmpty(specificVersion))
                    {
                        return $"v{specificVersion}" == version;
                    }

                    var versions = endpointMetadata
                            .Where(data => data is ApiVersionAttribute)
                            .SelectMany(data => (data as ApiVersionAttribute).Versions)
                            .Select(apiVersion => apiVersion.ToString());

                    return versions.Any(v => $"v{v}" == version);
                });
 类似资料:
  • 我是新手所以我可能错过了什么

  • 我们在我们的泽西应用程序中使用了@Role允许注释来限制用户对应用编程接口某些部分的访问。我们如何在SwaggerUI中显示这些信息? 到目前为止,我已经用@ApiOperation注释了方法以显示in/out参数,并尝试使用@Authorization/@AuthorizationScope,但我只为我们不使用的oauth2显示了它。最接近out case的是ApiKeyAuthDefiniti

  • 我正在使用Spring Boot2开发一个REST api。我在build.gradle文件中为Swagger2和Swagger-UI添加了SpringFox依赖项,如下所示: 不幸的是,像@enableswagger2这样的大摇大摆的注释似乎没有被识别出来。我该怎么办?

  • 我创建了一个新的Web Api项目,添加了ASP.NET标识并配置了OAuth,如下所示: 谢了。 另外,我应该说Swagger文档对我所有的控制器都适用,只是我忽略了一个明显的方法--如何登录。

  • 给定以下架构定义(这是定义所需属性的有效方法):

  • 我们有一个。NET解决方案,有两个项目: null 当将Swagger UI添加到API项目(不是首选解决方案)时,它根本不起作用,可能是因为自定义控制器选择器 然而,我认为我遗漏了一些明显的东西,因为这感觉像是我们遗漏的一个非常基本的配置设置