我想使用Swashbuckle.AspNetCore.Cli和SwaggerHostFactory来生成swagger.json。
生成的swagger.json对于path和compoments总是空的,这很奇怪。
创建项目
dotnet new webapi -o DemoWebApi
cd DemoWebApi
dotnet restore示例
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" />
</ItemGroup>
<!-- create openapi cli -->
<Target Name="OpenApiCliBuild" AfterTargets="PostBuildEvent" Condition="'$(Configuration)' == 'Debug'">
<!-- create static file openapi doc -->
<Exec Command="dotnet tool restore" />
<Exec Command="dotnet new tool-manifest --force" />
<Exec Command="dotnet tool install --local Swashbuckle.AspNetCore.Cli --version 6.4.0" />
<Exec Command="dotnet swagger tofile --output swagger.json $(OutputPath)\$(AssemblyName).dll v1" />
</Target>
</Project>// SwaggerHostFactory.cs
public class SwaggerHostFactory
{
public static IHost CreateHost()
{
var builder = WebApplication.CreateBuilder();
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
return app;
}
}
// Program.cs
var builder = WebApplication.CreateBuilder(args);
// ignore... same as SwaggerHostFactory
app.MapControllers();
app.Run();运行项目
dotnet watch run预期产出
如果不使用SwaggerHostFactory,则为
{
"openapi": "3.0.1",
"info": {
"title": "DemoWebApi, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null",
"version": "1.0"
},
"paths": {
"/WeatherForecast": {
"get": {
"tags": [
"WeatherForecast"
],
// ...ignore
}
}
}
,
"components": {
"schemas": {
"WeatherForecast": {
"type": "object",
// ...ignore
}
}
}
}实际输出
使用SwaggerHostFactory的
{
"openapi": "3.0.1",
"info": {
"title": "dotnet-swagger",
"version": "1.0"
},
"paths": { },
"components": { }
}Swashbuckle.AspNetCore.Cli支持是否使用SwaggerHostFactory int .NET 6?我该怎么做?
发布于 2022-09-22 08:12:47
最后,我放弃了使用ASP.NET Core 6 top-level statements,使用了SwaggerHostFactory的旧风格,它运行得很好。
但我认为其他人可能有更好的方法。
public class SwaggerHostFactory
{
public static IHost CreateHost()
{
return Host.CreateDefaultBuilder(new string[0])
.ConfigureWebHostDefaults(b => b.UseStartup<SwaggerStartup>())
.Build();
}
private class SwaggerStartup
{
public SwaggerStartup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddEndpointsApiExplorer();
services.AddSwaggerGen();
}
public void Configure(IApplicationBuilder app) {}
}
}https://stackoverflow.com/questions/73810551
复制相似问题