Asp.net core Swagger版本控制-在satartup中的document.basePath中设置v{version:apiVersion},而不是在控制器中设置Route属性

Asp.net core Swagger版本控制-在satartup中的document.basePath中设置v{version:apiVersion},而不是在控制器中设置Route属性,asp.net-core,swagger,azure-api-management,swashbuckle.aspnetcore,Asp.net Core,Swagger,Azure Api Management,Swashbuckle.aspnetcore,我最近遇到了一个小问题,我想解决一个关于我的一个API的自大生成API文档的问题 我偶然发现的问题与Azure API管理阅读我的招摇过市文档并在门户中自动设置API的方式有关 详细地说,我注意到,每次我更新API时,如果需要将更新后的swagger文档导入门户,我的基本地址就会消失,而作为API多个版本的文档,版本“前缀”会出现在API管理中的后缀上,而不是基本URL的一部分 这反过来会导致APIM URL中出现多个版本标识符,而不是一个。 例如: 将APIM转换为: [APIM API BA

我最近遇到了一个小问题,我想解决一个关于我的一个API的自大生成API文档的问题

我偶然发现的问题与Azure API管理阅读我的招摇过市文档并在门户中自动设置API的方式有关

详细地说,我注意到,每次我更新API时,如果需要将更新后的swagger文档导入门户,我的基本地址就会消失,而作为API多个版本的文档,版本“前缀”会出现在API管理中的后缀上,而不是基本URL的一部分

这反过来会导致APIM URL中出现多个版本标识符,而不是一个。 例如:

将APIM转换为:

[APIM API BASE URL]/v1/v1/[Controller]/[Action]
我通过在我的Startup类中的“preserializefilters”中添加“host”来解决基址消失的问题:

    app.UseSwagger(c =>
    {
        c.PreSerializeFilters.Add((document, request) =>
        {
            document.Host = request.Host.Value;
            document.Paths = document.Paths.ToDictionary(p => p.Key.ToLowerInvariant(), p => p.Value);
        });
    });
接下来,通过向文件服务器添加“basePath”属性,尝试将版本前缀从控制器中的“路由”属性移动到启动类中的预初始化过滤器

所以从我的路由属性中删除“v{version:apiVersion}”

[ApiVersion("1.0")]
[ApiExplorerSettings(GroupName = "v1")]
[Route("v{version:apiVersion}/[controller]/[action]")]
[Produces("application/json", "application/xml")]
导致

[ApiVersion("1.0")]
[ApiExplorerSettings(GroupName = "v1")]
[Route("/[controller]/[action]")]
[Produces("application/json", "application/xml")]
然后将“basePath”添加到我的startup类中的“PreSerializeFilters”中:

    app.UseSwagger(c =>
    {
        c.PreSerializeFilters.Add((document, request) =>
        {
            document.Host = request.Host.Value;
            document.BasePath = "/" + document.Info.Version;
            document.Paths = document.Paths.ToDictionary(p => p.Key.ToLowerInvariant(), p => p.Value);
        });
    });
因此,完成此操作后,一切看起来都设置正确,但当从swagger portal和postman发送请求borth时,api似乎混淆了或完全无法正确路由请求,如下图中显示“v1”请求的最后一个片段所示,尝试输入“v2”操作失败导致“404未找到”:

有人知道如何正确设置吗

关于我使用的更多信息如下:

  • .Net核心2.1
  • Swashback.AspNetCore.Swagger(4.0.1)
  • Swashback.AspNetCore.Annotations(4.0.1)
    app.UseSwagger(c =>
    {
        c.PreSerializeFilters.Add((document, request) =>
        {
            document.Host = request.Host.Value;
            document.BasePath = "/" + document.Info.Version;
            document.Paths = document.Paths.ToDictionary(p => p.Key.ToLowerInvariant(), p => p.Value);
        });
    });