使用Swashback for versioned API生成swagger JSON文件时删除部分URL路径';s

使用Swashback for versioned API生成swagger JSON文件时删除部分URL路径';s,api,.net-core,azure-api-management,swashbuckle.aspnetcore,aspnet-api-versioning,Api,.net Core,Azure Api Management,Swashbuckle.aspnetcore,Aspnet Api Versioning,我有一个带有版本控制的.NET核心Web API。目前有2个版本,2个swagger文件中的操作路径如下所示: /api/v1/Versioning/List (v1 swagger) /api/v2/Versioning/List (v2 swagger) Azure DevOps中有一个构建管道,它使用PowerShell生成2个招摇过市文件: `dotnet swagger tofile --output pathToV1Json MyApplication.dll v1` 及 并将其

我有一个带有版本控制的.NET核心Web API。目前有2个版本,2个swagger文件中的操作路径如下所示:

/api/v1/Versioning/List (v1 swagger)
/api/v2/Versioning/List (v2 swagger)
Azure DevOps中有一个构建管道,它使用PowerShell生成2个招摇过市文件:

`dotnet swagger tofile --output pathToV1Json MyApplication.dll v1`

并将其存储在工件中。在发布管道中,我使用
创建或更新版本化API
API管理任务在Azure API管理中创建/更新我的API,使用这些生成的swagger文件

到目前为止一切正常。 但是,正如预期的那样,发布步骤向URL添加了另一个版本部分。因此,在API管理中的最后一次API操作中,URL的外观如下所示:

.../v1/api/v1/Versioning/List (v1 swagger)
.../v2/api/v2/Versioning/List (v2 swagger)
我试图使用IDocumentFilter编辑swagger文件中生成的操作路径,这是可行的,但它也破坏了swagger UI。 是否有某种方法可以修改这些操作路径,但只能在生成实际的Swagger文件时修改

因此,在我的IDocumentFilter中,我可以有如下内容:

    public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
    {
        var openApiPaths = new OpenApiPaths();
        foreach (var path in swaggerDoc.Paths)
        {
            if ([generating actual swagger file])
            {
                openApiPaths.Add(path.Key.Replace("/v1", ""), path.Value);
            }
            else
            {
                openApiPaths.Add(path.Key, path.Value);
            }
        }
        swaggerDoc.Paths = openApiPaths;
    }

您可以将IHttpContextAccessor注入到DocumentFilter中,并检查是否确实存在可用的HttpRequest,如下所示:


公共类DocumentFilter:IDocumentFilter
{
专用只读IHttpContextAccessor\u httpContextAccessor;
公共文档筛选器(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor=httpContextAccessor;
}
公共作废应用(OpenApiDocument swaggerDoc、DocumentFilterContext上下文)
{
var request=\u httpContextAccessor.HttpContext?.request;
if(请求==null)
{
var copy=new openapipath();
foreach(swaggerDoc.path中的变量路径)
{
var newKey=path.Key.Replace(“x”,“y”);
copy.Add(newKey,path.Value);
}
swaggerDoc.path.Clear();
swaggerDoc.path=复制;
}
}
}
    public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
    {
        var openApiPaths = new OpenApiPaths();
        foreach (var path in swaggerDoc.Paths)
        {
            if ([generating actual swagger file])
            {
                openApiPaths.Add(path.Key.Replace("/v1", ""), path.Value);
            }
            else
            {
                openApiPaths.Add(path.Key, path.Value);
            }
        }
        swaggerDoc.Paths = openApiPaths;
    }