在 Swagger 生成期间导入 OpenAPI 文档或 JSON



我有一个小程序,它接受一个程序集并生成所有相关OpenApiDocument。 现在,我的问题是,这可以导入Swagger吗? 我知道您可以在创建文档后添加过滤器以修改文档,但我想知道您是否可以为 Swagger 提供文档并绕过自动生成。

IDocumentFilter内部,它允许您修改 Swagger 创建的OpenApiDocument,但我想使用我自己的OpenApiDocument.

public interface IDocumentFilter
{
void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context);
}

以下是我想配置 Swagger 以使用预定义OpenApiDocument的地方:

public void ConfigureServices(IServiceCollection services)
{
services.AddSwaggerGen(setupAction => TODO);
}
public void Configure(IApplicationBuilder app, IApiVersionDescriptionProvider provider)
{
}

以下是我在配置 Swagger 时希望在 API 启动中使用的公开可用方法:

public static IEnumerable<OpenApiDocument> CreateDocuments(this Assembly assembly, string title, string description, string name, string email)
{
return ControllerInfo.FindControllers(assembly)
.GroupBy(controller => controller.Version)
.OrderBy(group => group.Key)
.Select(group => CreateDocument(group.Key, group, title, description, name, email));
}
public static string ToJson(this OpenApiDocument document)
{
using var outputString = new StringWriter();
document.SerializeAsV3(new OpenApiJsonWriter(outputString));
return outputString.ToString();
}

我相信通过一些反复试验,我得出了一个可行的解决方案。

public void ConfigureSwagger(IApplicationBuilder app)
{
const string swagger = "Swagger";
var directory = Path.Combine(Directory.GetCurrentDirectory(), swagger);
Directory.CreateDirectory(directory);
app.UseDefaultFiles().UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(directory),
RequestPath = $"/{swagger}"
});
app.UseSwaggerUI(c =>
{
foreach (var document in Assembly.GetExecutingAssembly().CreateDocuments("title", "description", "name", "email"))
{
var file = $"swagger{document.Info.Version}.json";
File.WriteAllText(Path.Combine(directory, file), document.ToJson());
c.SwaggerEndpoint($"/{swagger}/{file}", $"{document.Info.Title} {document.Info.Version}");
}
});
}

最新更新