如何使swagger在.net core web API中使用自定义swagger文件而不是自动生成的文件

nfg76nw0  于 2023-05-28  发布在  .NET
关注(0)|答案(3)|浏览(156)

创建了新的.net core 3.1 Web API项目,并将Swashbuckle配置为使用swagger。
一切正常,但我需要我的应用程序使用我自己的swagger规范文件,而不是自动生成的文件(\swagger\v1\swagger.json
我搜索了很多像this这样的帖子,但没有一个对这里有帮助。
我已经在项目的根路径中创建了my-custom-swagger.json文件(与.csproj相同的目录)
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;
        });

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

niwlg2el

niwlg2el1#

如果你想为swaggerUI提供你自己的自定义swagger/OpenAPI文件,那么下面是你需要做的(用c#. net 5编写的代码)
在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
    });
pod7payv

pod7payv2#

我只是碰巧遇到了这个。我不明白为什么这是如此复杂,当它应该是非常简单的。
无论如何,我在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"));
        }
    //...

将customswagger.json放在rootSolutionFolder/Swagger中,如PhysicalFileProvider部分所示,并将其Map到/CustomSwagger,因此我可以在app.UseSwaggerUI部分中使用它。

7vux5j2d

7vux5j2d3#

最简单的解决方案是将swagger文件放在wwwroot文件夹中。您可能需要创建此文件夹,因为它通常不属于Web API。
创建文件夹后,配置启动过程以使用StaticFiles中间件,这将启用文件浏览,这意味着您可以通过HTTP访问文件,然后您需要做的就是更改Swagger UI加载文件的端点。
例如,如果我在wwwroot/swagger/v1/swagger.json中有一个文件,我将需要使用以下代码

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at 
https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer(); 
builder.Services.AddSwaggerGen();

var app = builder.Build();
app.UseStaticFiles();
app.UseSwagger();

// UI should use the path to the file location.
app.UseSwaggerUI(c=>c.SwaggerEndpoint("/swagger/v1/swagger.json", "v1")); 
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();

如果处理YAML,则需要使用FileExtensionContentTypeProvider,因为.NET只允许具有IANA组定义的媒体类型的文件,但您可以使用以下代码覆盖此行为。

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at 
https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();
var provider = new FileExtensionContentTypeProvider();

// Add new mappings

// Allow YAML files to be served via HTTP request.
provider.Mappings[".yaml"] = "text/yaml"; 

app.UseStaticFiles(new StaticFileOptions
{
  ContentTypeProvider = provider
});

app.UseSwagger();
app.UseSwaggerUI(c=>c.SwaggerEndpoint("/swagger/v1/swagger.yaml", "v1"));
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();

相关问题