使用 NSwag 生成 C# 客户端会在同一个文件中错误地创建 2x 个同名的部分类

问题描述 投票:0回答:3

我正在尝试从 OpenAPI json 文件生成 NSwag C# 客户端。

当我这样做时,我确实生成了一个客户端文件,但它无法编译。它在同一个 .cs 文件中创建了 2x 部分类。

现在,如果我将其中一个类名更改为其他名称,该文件现在可以编译:

没有错误 - 编译正常。

所以我的问题是:为什么要这样做?

这是我的 Swagger UI 的图片(这是用 Swashbuckle 生成的,而不是 NSwag):

所以这意味着我的项目中有 2 个控制器:

  • 家庭控制器
  • 文档控制器

有什么技巧可以解决这个问题吗?

我使用以下命令行来生成客户端:

dotnet-openapi --updateProject .\MyProject.csproj http://localhost:5100/swagger/v1/swagger.json

据我所知,Dotnet-openapi 正在“幕后”使用 NSwag CSharpClientGenerator。

我很高兴使用任何其他工具来生成 C# 客户端。

c# swagger openapi nswag
3个回答
2
投票

我遇到了这个问题,在盯着代码一段时间后能够解决它。问题是我的端点在 uri 中有一个下划线 (

_
),这显然与 nswag 不兼容;

[HttpPost("a_bad_uri_with_underscore")]
public void SomeMethod() => _someHandler.Execute();

输入下划线是一个错误,我的意图是使用破折号(

-
),所以一旦更改它就可以了。

[HttpPost("a-working-uri-with-dash")]
public void SomeMethod() => _someHandler.Execute();

2
投票

这需要一段时间才能弄清楚。其他答案以某种方式列出了生成器上的设置

OperationGenerationMode.SingleClientFromOperationId
,但我找不到如何做到这一点。我检查了 NSwag 源代码以了解如何设置它。

var document = await OpenApiYamlDocument.FromFileAsync("api.yaml");

var settings = new CSharpClientGeneratorSettings()
{
    ClassName = "MyClient",
};
settings.CSharpGeneratorSettings.Namespace = "MyNamespace";

var generator = new CSharpClientGenerator(document, settings);

// How to Set SingleClientFromOperationId
generator.BaseSettings.OperationNameGenerator = new SingleClientFromOperationIdOperationNameGenerator();

var code = generator.GenerateFile();

File.WriteAllText("client.cs", code);

0
投票

在我的例子中,解决方案是添加 NSWag CLI 参数:/OperationGenerationMode:SingleClientFromOperationId

© www.soinside.com 2019 - 2024. All rights reserved.