如何使用.net核心网络api中的自定义swagger文件而不是自动生成的文件来制作swagger

时间:2019-12-15 00:04:12

标签: .net-core swagger swashbuckle

创建了新的.net core 3.1 Web Api项目,并将Swashbuckle配置为使用swagger。

一切正常,但是我需要我的应用程序使用我自己的swagger spec文件而不是自动生成的文件(\swagger\v1\swagger.json

我搜索了许多诸如this之类的帖子,但在此都没有帮助。

我已经在项目的根路径(与.csproj相同的目录)中创建了my-custom-swagger.json文件

Startup.cs

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        app.UseStaticFiles();
        app.UseSwagger();

    //    app.UseStaticFiles(new StaticFileOptions
    //{
    //    FileProvider = new PhysicalFileProvider(AppContext.BaseDirectory),
    //    RequestPath = "my-custom-swagger.json"
    //    });

        app.UseSwaggerUI(c =>
        {
            c.SwaggerEndpoint("/swagger/v1/swagger.json", "Core Test SW");
            c.RoutePrefix = string.Empty;
        });

如何使用my-custom-swagger.json文件而不是自动生成的文件

3 个答案:

答案 0 :(得分:2)

如果您想为 swaggerUI 提供您自己的自定义 swagger/OpenAPI 文件,那么您需要执行以下操作(c# .net5 中的代码)

在 ConfigureServices() 添加

   .AddSwaggerGen()

.AddSwaggerGenNewtonsoftSupport() 如果您依赖 Newtonsoft.Json 序列化

在配置中添加

    .UseSwagger()
    .UseSwaggerUI(c =>
    {
        c.SwaggerEndpoint("/internal/swagger.json", "v1");
    })

现在我们需要使用自定义文件公开一个端点。

    .UseEndpoints(endpoints =>
    {
        endpoints.MapGet("/internal/swagger.json", async context =>
        {
            await context.Response.WriteAsync(await File.ReadAllTextAsync("my-custom-swagger.json"));
        });
            
        // the rest of your code goes here
    });

答案 1 :(得分:1)

默认情况下,Swagger将返回默认文档,其中包括项目中所有REST服务的描述。

但是,可以通过调用DocInclusionPredicate(Func<string, ApiDescription> predicate)来更改此默认值-必须将传递给它的函数传递给它,该函数接收JSON文档名称和操作方法描述,并且如果应将操作文档包括在其中,则应返回true。该JSON文档。

下面未测试的代码。

services.AddSwaggerGen(c => {
    c.DocInclusionPredicate((docName, description) => {
        if (docName == "my-custom-swagger") {
            return true;
        }

        return false;
    });

})

所有功劳应该归功于:掌握使用C#8和.NET Core 3的软件体系结构

答案 2 :(得分:0)

我刚遇到这个。我不明白为什么这本应该很简单,却如此复杂。

无论如何,我在 Startup.cs (.Net Core 5) 中用这段代码解决了这个问题:

    public void ConfigureServices(IServiceCollection services)
    {

        services.AddControllers();
        services.AddSwaggerGen();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseStaticFiles(new StaticFileOptions
            {
                FileProvider = new PhysicalFileProvider(
        Path.Combine(Directory.GetCurrentDirectory(), "Swagger")),
                RequestPath = "/CustomSwagger"
            });

            app.UseDeveloperExceptionPage();
            app.UseSwagger();
            app.UseSwaggerUI(c => c.SwaggerEndpoint("/CustomSwagger/customswagger.json", "MySwagger"));
        }
    //...

rootSolutionFolder/Swagger 中包含 customwagger.json,正如在 PhysicalFileProvider 部分中看到的那样,并将其映射到 /CustomSwagger,因此我可以在 app.UseSwaggerUI 部分中使用它。< /p>