ABP/Swashbuckle - 使用Swashbuckle CLI 生成Swagger文档

3

使用ABP框架(3.3)和ASP.NET Core(3.1)。

我试图使用Swashbuckle.AspNetCore.Cli(https://github.com/domaindrivendev/Swashbuckle.AspNetCore#retrieve-swagger-directly-from-a-startup-assembly)生成swagger.json,编译应用程序后,使用以下命令指向已编译的dll:

dotnet swagger tofile --output "C:\temp\swagger" .\bin\Release\netcoreapp3.1\MyBin.dll v1

它给我下面的异常:

Unhandled exception. System.ArgumentNullException: Value cannot be null. (Parameter 'provider')
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
   at Microsoft.Extensions.DependencyInjection.ServiceCollectionCommonExtensions.GetRequiredService[T](IServiceCollection services)
   at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode)
   at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor)
   at System.Lazy`1.CreateValue()
   at System.Lazy`1.get_Value()
   at Volo.Abp.AspNetCore.Mvc.AbpDataAnnotationAutoLocalizationMetadataDetailsProvider.CreateDisplayMetadata(DisplayMetadataProviderContext context)
   at Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.DefaultCompositeMetadataDetailsProvider.CreateDisplayMetadata(DisplayMetadataProviderContext context)
   at Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.DefaultModelMetadata.get_DisplayMetadata()
   at Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.DefaultModelMetadata.get_Order()
   at Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.DefaultModelMetadata.<>c.<get_Properties>b__78_0(ModelMetadata p)
   at System.Linq.EnumerableSorter`2.ComputeKeys(TElement[] elements, Int32 count)
   at System.Linq.EnumerableSorter`1.ComputeMap(TElement[] elements, Int32 count)
   at System.Linq.EnumerableSorter`1.Sort(TElement[] elements, Int32 count)
   at System.Linq.OrderedEnumerable`1.ToList()
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at Microsoft.AspNetCore.Mvc.ModelBinding.ModelPropertyCollection..ctor(IEnumerable`1 properties)
   at Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.DefaultModelMetadata.get_Properties()
   at Microsoft.AspNetCore.Mvc.ModelBinding.ModelMetadataProviderExtensions.GetMetadataForProperty(IModelMetadataProvider provider, Type containerType, String propertyName)
   at Microsoft.AspNetCore.Mvc.ApplicationModels.DefaultApplicationModelProvider.CreatePropertyModel(PropertyInfo propertyInfo)
   at Microsoft.AspNetCore.Mvc.ApplicationModels.DefaultApplicationModelProvider.OnProvidersExecuting(ApplicationModelProviderContext context)
   at Microsoft.AspNetCore.Mvc.ApplicationModels.ApplicationModelFactory.CreateApplicationModel(IEnumerable`1 controllerTypes)
   at Microsoft.AspNetCore.Mvc.ApplicationModels.ControllerActionDescriptorProvider.GetDescriptors()
   at Microsoft.AspNetCore.Mvc.ApplicationModels.ControllerActionDescriptorProvider.OnProvidersExecuting(ActionDescriptorProviderContext context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.DefaultActionDescriptorCollectionProvider.UpdateCollection()
   at Microsoft.AspNetCore.Mvc.Infrastructure.DefaultActionDescriptorCollectionProvider.Initialize()
   at Microsoft.AspNetCore.Mvc.Infrastructure.DefaultActionDescriptorCollectionProvider.get_ActionDescriptors()
   at Microsoft.AspNetCore.Mvc.ApiExplorer.ApiDescriptionGroupCollectionProvider.get_ApiDescriptionGroups()
   at Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator.GetSwagger(String documentName, String host, String basePath)
   at Swashbuckle.AspNetCore.Cli.Program.<>c.<Main>b__0_3(IDictionary`2 namedArgs) in C:\projects\ahoy\src\Swashbuckle.AspNetCore.Cli\Program.cs:line 72
   at Swashbuckle.AspNetCore.Cli.CommandRunner.Run(IEnumerable`1 args) in C:\projects\ahoy\src\Swashbuckle.AspNetCore.Cli\CommandRunner.cs:line 68
   at Swashbuckle.AspNetCore.Cli.CommandRunner.Run(IEnumerable`1 args) in C:\projects\ahoy\src\Swashbuckle.AspNetCore.Cli\CommandRunner.cs:line 68
   at Swashbuckle.AspNetCore.Cli.Program.Main(String[] args) in C:\projects\ahoy\src\Swashbuckle.AspNetCore.Cli\Program.cs:line 111

我也尝试按照 Swashbuckle 文档创建了一个公共类,因为我们正在使用 Autofac:

    public class SwaggerHostFactory
    {
        public static IHost CreateHost()
        {
            return Program.CreateHostBuilder(new string[0]).Build(); //Calls the same builder that's used to run the app
        }
    }

意图是允许在我们的流水线中运行此操作,以自动生成ApiClient库。
我不太确定如何解决这个问题。swagger.json在运行时生成得非常好?
感谢任何帮助!
4个回答

1

避免这种情况的一种方法是确保您的程序在没有这些应用程序设置的情况下继续运行。

var connectionString = config["MyConnectionString"];
if (connectionString != null)
{
    services.AddDbContext<AppDbContext>(options =>
        options.UseSqlServer(connectionString));
}

0
如果你有一些appsettings.json文件(即使是默认的),请考虑先将目录更改为.\bin\Release\netcoreapp3.1。这对我来说解决了问题。

0
我最近遇到了一个类似的问题,版本是6.4.0,原因是在我的构建目录之外执行swagger。
似乎swagger尝试使用当前目录来查找与您的应用程序一起使用的dll,而不是匹配dll目录。如果您从更高的目录运行swagger,并指向您的启动dll,它将无法找到任何其他依赖项。
例如1(对我无效)
PS C:\Project\<ProjectName>: swagger tofile --output Swagger.json .\bin\Debug\net6.0\<ProjectName>.dll

注意,我目前的位置比我的启动dll文件高出几个目录。

例2(适用于我)

PS C:\Project\<ProjectName>\bin\net6.0: swagger tofile --output Swagger.json <ProjectName>.dll

对于我的构建过程,我在项目中添加了一个 PowerShell 脚本,该脚本由构建调用。
param (
    [string]$OutDir,
    [string]$TargetName
)

# Navigate to the output directory to run Swagger
Push-Location -Path $OutDir

# Execute the swagger cli to generate a swagger.json output file based on the executing startup project
swagger tofile --output "Swagger.json" "$TargetName" "v1"

# Return to the original location
Pop-Location

在.csproj文件中,你可以自动化这个过程。
<Target Name="GenerateSwagger" AfterTargets="Build">
  <Exec Command="powershell -File $(ProjectDir)$(OutDir)Scripts\GenerateSwagger.ps1 -OutDir $(ProjectDir)$(OutDir) -TargetName $(TargetName).dll" />
</Target>

-2

您可以在不使用Swagger CLI的情况下轻松获取Swagger.json

使用dotnet命令运行您的Web应用程序:

dotnet  MyCompanyName.MyProjectName.Web.dll

Running web


然后使用以下 Powershell 命令下载 Swagger.json

Invoke-WebRequest -Uri https://localhost:5001/swagger/v1/swagger.json -OutFile c:\temp\swagger.json    

Downloading Swagger.json


2
由于意图是在构建管道中使用它,因此仅在Cli包设计的情况下生成Swagger JSON似乎是一种hacky的方式,而我需要的正是这种功能。 - Jason Kingsmill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接