如何使用Swashbuckle.AspNetCore.Li和SwaggerHostFactory在.NET 6中正确生成



我想使用Swashbuckle.AspNetCore.CliSwaggerHostFactory生成swagger.json.

生成的swagger.json对于pathcompoments总是空的,这很奇怪。

创建项目

dotnet new webapi -o DemoWebApi
cd DemoWebApi
dotnet restore

示例

  • DemoWebApi.csrpoj
<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>
  • C#代码
// 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支持使用SwaggerHostFactoryint.NET 6吗?我该怎么办?

最后我放弃了使用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://github.com/domaindrivendev/Swashbuckle.AspNetCore/issues/1580#issuecomment-1292223833(,这对我有帮助:

为了解决这个问题,我必须为应用程序名称设置一个值,所以最后我的SwaggerHostFactory.CreateHost看起来是这样的:

var builder = WebApplication.CreateBuilder(new WebApplicationOptions
{
ApplicationName = typeof(SwaggerHostFactory).Namespace // without it, actions won't be added to swagger file
});

因此,指定ApplicationName可能会有所帮助,您可以在链接中找到更多详细信息。

最新更新