使用Swashbuckle V5从代码生成swagger.json

qzwqbdag  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(109)

我使用的是Swashbuckle AspNetCore v4.x.x,我升级到了v5.1.x.x。但是我使用的代码不再工作了,因为缺少类“SwaggerContractResolver”。
我尝试的目标是在RESTfull API的代码中生成swagger.json:

public static string GenerateSwagger(this IWebHost webhost, string docName, string basePath)
{
    var sw = (ISwaggerProvider)webhost.Services.GetService(typeof(ISwaggerProvider));
    var doc = sw.GetSwagger(docName, null, basePath);

    var json = JsonConvert.SerializeObject(
        doc,
        Formatting.Indented,
        new JsonSerializerSettings
        {
            NullValueHandling = NullValueHandling.Ignore,
            ContractResolver = new SwaggerContractResolver(new JsonSerializerSettings())
        }
    );

    return json;
}
string json = GenerateSwagger(webhost, docName, url);
string path = Path.Combine(path, docName);
File.WriteAllText(path + ".json", json);

我怎么能像v4一样工作,但使用新版本的Swashbuckle AspnetCore?

mrfwxfqh

mrfwxfqh1#

使用Swashbuckle V5,您可以使用.NET Core CLI来生成swagger合约:
https://github.com/domaindrivendev/Swashbuckle.AspNetCore#swashbuckleaspnetcorecli
但这只适用于.NET Core API。对于.NET Framework,您可以使用此方法:

public static string GenerateSwagger(this IWebHost webhost, string docName, string basePath)
{
    var sw = webhost.Services.GetRequiredService<ISwaggerProvider>();
    var doc = sw.GetSwagger(docName, null, basePath);

    using (var streamWriter = new StringWriter())
    {
        var writer = new OpenApiJsonWriter(streamWriter);
        doc.SerializeAsV3(writer);
        return streamWriter.ToString();
    }
}

如果你想要YAML swagger合约,你可以将OpenApiJsonWriter切换到OpenApiYamlWriter
如果你想要V2 swagger合约,你可以将SerializeAsV3切换到SerializeAsV2

koaltpgm

koaltpgm2#

对于Swashbuckle V5和更新版本,您可以使用以下扩展方法。

using Microsoft.OpenApi.Extensions;
using Swashbuckle.AspNetCore.Swagger;

public static class SwaggerExtensions
{
    public static void SaveSwaggerJson(this IServiceProvider provider)
    {
        ISwaggerProvider sw = provider.GetRequiredService<ISwaggerProvider>();
        OpenApiDocument doc = sw.GetSwagger("v1", null, "/");
        string swaggerFile = doc.SerializeAsJson(Microsoft.OpenApi.OpenApiSpecVersion.OpenApi3_0);
        File.WriteAllText("swaggerfile.json", swaggerFile);
    }
}

几个音符

如果您使用的是新的ASP.NETCore模板,则可以像这样调用此方法

WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
...
WebApplication app = builder.Build();
...
app.Services.SaveSwaggerJson();
...
app.Run();

相关问题