创建了新的.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
文件而不是自动生成的文件
答案 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>