C# 创建一个;最新;通过Swashback发布的swagger文档版本

C# 创建一个;最新;通过Swashback发布的swagger文档版本,c#,swashbuckle.aspnetcore,C#,Swashbuckle.aspnetcore,我正在开发一个面向公众的API,使用swashback.AspNetCore和ReDoc获取有关Microsoft.AspNetCore.Mvc.Versioning的文档,以使用属性对控制器进行版本控制 我们希望有一个大摇大摆的文档,显示我们端点的所有最新版本,以便第一次使用API的人更容易选择正确的版本 我当前的尝试是创建一个“v0”,并将该版本应用于所有最新版本的控制器。然后,我使用操作过滤器将“v0”替换为任何最新版本: 公共类LatestVersionOperationFilter:I

我正在开发一个面向公众的API,使用
swashback.AspNetCore
ReDoc
获取有关
Microsoft.AspNetCore.Mvc.Versioning
的文档,以使用属性对控制器进行版本控制

我们希望有一个大摇大摆的文档,显示我们端点的所有最新版本,以便第一次使用API的人更容易选择正确的版本

我当前的尝试是创建一个“v0”,并将该版本应用于所有最新版本的控制器。然后,我使用操作过滤器将“v0”替换为任何最新版本:

公共类LatestVersionOperationFilter:IOperationFilter
{
公共无效应用(OpenApiOperation操作,OperationFilterContext上下文)
{
var version=(context.MethodInfo.GetCustomAttributes()
.Union(context.MethodInfo.DeclaringType.GetCustomAttributes())
.SelectMany(x=>x.Versions)
.OrderByDescending(x=>x.MajorVersion))
.FirstOrDefault(x=>x.MajorVersion!=0);
if(version!=null&&context.apiscription.RelativePath.Contains(“v0”))
{
context.apiscription.RelativePath=context.apiscription.RelativePath
.Replace(“v0”,$“v{version.MajorVersion}”);
}
}
}
这在大多数情况下都是有效的,但有时它似乎不起作用,最终你会得到一堆输入了“v0”的URL。过滤器运行,但似乎没有反映在生成的招摇过市文档中


有没有更好的方法来实现我们的目标?我试图使用
DocInclusionPredicate
编写一些东西,但似乎无法得到我想要的东西。

在进一步挖掘之后,我发现了这个老问题:

我以前尝试过文档过滤器,但感觉它走错了路。看到这个问题,我又试了一次,下面的内容正在为我们工作:

公共类LatestVersionDocumentFilter:IDocumentFilter
{
公共作废应用(OpenApiDocument swaggerDoc、DocumentFilterContext上下文)
{
foreach(swaggerDoc.path.ToList()中的变量路径)
{
如果(!path.Key.Contains(“v0”))
{
继续;
}
var apisdescription=context.apisdescriptions.FirstOrDefault(x=>x.RelativePath==path.Key.TrimStart('/');
if(apiscription!=null&&apiscription.TryGetMethodInfo(out-var-methodInfo))
{
var latestVersion=methodInfo.GetCustomAttributes()
.Union(methodInfo.DeclaringType.GetCustomAttributes())
.SelectMany(x=>x.Versions)
.OrderByDescending(x=>x.MajorVersion)
.FirstOrDefault(x=>x.MajorVersion!=0);
如果(最新版本!=null)
{
swaggerDoc.path.Remove(path.Key);
var latestUrl=path.Key.Replace(“/v0/”,$”/v{latestVersion.majorvision}/”;
swaggerDoc.path.Add(latestUrl,path.Value);
}
}
}
}
}