通过 Connected Services 创建 openapi 客户端后生成错误
Build errors after creating an openapi client via Connected Services
我想添加对现有项目的 OpenAPI 服务引用。在 Connected Services 视图中,使用以下值:
然后我点击完成,构建项目并将 PetStoreApiClient.cs 添加到项目中。
最后,我尝试在使用 PetStoreApiClient 时再次构建解决方案。 Visual Studio 显示几个编译错误,例如:
多项重复,连baseUrl生成多次:
Ambiguity between 'PetStoreApiClient.BaseUrl' and 'PetStoreApiClient.BaseUrl' ConsoleApp C:\..\ConsoleApp\ConsoleApp\obj\openapi1Client.cs
csproj 文件包含下一个设置,如第一个屏幕截图所示:
<ItemGroup>
<OpenApiReference Include="OpenAPIs\openapi.json" CodeGenerator="NSwagCSharp" ClassName="PetStoreApiClient" OutputPath="PetStoreApiClient.cs">
<SourceUri>https://petstore3.swagger.io/api/v3/openapi.json</SourceUri>
</OpenApiReference>
我应该使用不同的设置,我在 csproj 中缺少设置吗?
GitHub 上描述了类似的问题,但提供的解决方案不起作用。
我遇到了同样的问题,但很难找到好的答案。
直到我发现这个:https://github.com/RicoSuter/NSwag/issues/334
“如果您有多个控制器,则必须选择 OperationGenerationMode.SingleClientFromOperationId 或在您的控制器 class 名称中使用占位符 {controller}。”
所以我的问题是通过简单地提供“{controller}Client”作为 class 名称来解决的。
我最终使用了 NSwag.MSBuild,完美无缺!
结果是 TestClient.cs 和 TestClient.Interface.cs。 TestClient 可用于执行请求。
nswag.json
{
"runtime": "NetCore31",
"defaultVariables": "Configuration=Debug",
"documentGenerator": {
"fromDocument": {
"url": "<your url>/swagger.json"
}
},
"codeGenerators": {
"openApiToCSharpClient": {
"generateClientInterfaces": true,
"exceptionClass": "$(SdkName)ApiException",
"useBaseUrl": true,
"generateBaseUrlProperty": true,
"generateContractsOutput": true,
"contractsNamespace": "$(SdkNamespace).Interface",
"contractsOutputFilePath": "Generated\$(GeneratedContractFile)",
"className": "$(SdkName)",
"operationGenerationMode": "SingleClientFromOperationId",
"namespace": "$(SdkNamespace)",
"output": "Generated\$(GeneratedClientFile)"
}
}
}
csproj
<Target Name="GenerateSdk" BeforeTargets="Build">
<PropertyGroup>
<NSwagConfiguration>nswag.json</NSwagConfiguration>
<SdkNamespace>$(RootNamespace)</SdkNamespace>
<SdkName>TestClient</SdkName>
<GeneratedInterfaceFile>$(SdkName).Interface.cs</GeneratedInterfaceFile>
<GeneratedServiceFile>$(SdkName).cs</GeneratedServiceFile>
</PropertyGroup>
<Error Text="The NSwag configuration '$(NSwagConfiguration)' does not exists!" Condition="!Exists('$(NSwagConfiguration)')" />
<Exec Command="$(NSwagExe_Core31) run $(NSwagConfiguration) /variables:Configuration=$(Configuration),SdkName=$(SdkName),SdkNamespace=$(SdkNamespace),GeneratedClientFile=$(GeneratedServiceFile),GeneratedContractFile=$(GeneratedInterfaceFile)" />
</Target>
我想添加对现有项目的 OpenAPI 服务引用。在 Connected Services 视图中,使用以下值:
然后我点击完成,构建项目并将 PetStoreApiClient.cs 添加到项目中。
最后,我尝试在使用 PetStoreApiClient 时再次构建解决方案。 Visual Studio 显示几个编译错误,例如:
多项重复,连baseUrl生成多次:
Ambiguity between 'PetStoreApiClient.BaseUrl' and 'PetStoreApiClient.BaseUrl' ConsoleApp C:\..\ConsoleApp\ConsoleApp\obj\openapi1Client.cs
csproj 文件包含下一个设置,如第一个屏幕截图所示:
<ItemGroup>
<OpenApiReference Include="OpenAPIs\openapi.json" CodeGenerator="NSwagCSharp" ClassName="PetStoreApiClient" OutputPath="PetStoreApiClient.cs">
<SourceUri>https://petstore3.swagger.io/api/v3/openapi.json</SourceUri>
</OpenApiReference>
我应该使用不同的设置,我在 csproj 中缺少设置吗? GitHub 上描述了类似的问题,但提供的解决方案不起作用。
我遇到了同样的问题,但很难找到好的答案。
直到我发现这个:https://github.com/RicoSuter/NSwag/issues/334
“如果您有多个控制器,则必须选择 OperationGenerationMode.SingleClientFromOperationId 或在您的控制器 class 名称中使用占位符 {controller}。”
所以我的问题是通过简单地提供“{controller}Client”作为 class 名称来解决的。
我最终使用了 NSwag.MSBuild,完美无缺!
结果是 TestClient.cs 和 TestClient.Interface.cs。 TestClient 可用于执行请求。
nswag.json
{
"runtime": "NetCore31",
"defaultVariables": "Configuration=Debug",
"documentGenerator": {
"fromDocument": {
"url": "<your url>/swagger.json"
}
},
"codeGenerators": {
"openApiToCSharpClient": {
"generateClientInterfaces": true,
"exceptionClass": "$(SdkName)ApiException",
"useBaseUrl": true,
"generateBaseUrlProperty": true,
"generateContractsOutput": true,
"contractsNamespace": "$(SdkNamespace).Interface",
"contractsOutputFilePath": "Generated\$(GeneratedContractFile)",
"className": "$(SdkName)",
"operationGenerationMode": "SingleClientFromOperationId",
"namespace": "$(SdkNamespace)",
"output": "Generated\$(GeneratedClientFile)"
}
}
}
csproj
<Target Name="GenerateSdk" BeforeTargets="Build">
<PropertyGroup>
<NSwagConfiguration>nswag.json</NSwagConfiguration>
<SdkNamespace>$(RootNamespace)</SdkNamespace>
<SdkName>TestClient</SdkName>
<GeneratedInterfaceFile>$(SdkName).Interface.cs</GeneratedInterfaceFile>
<GeneratedServiceFile>$(SdkName).cs</GeneratedServiceFile>
</PropertyGroup>
<Error Text="The NSwag configuration '$(NSwagConfiguration)' does not exists!" Condition="!Exists('$(NSwagConfiguration)')" />
<Exec Command="$(NSwagExe_Core31) run $(NSwagConfiguration) /variables:Configuration=$(Configuration),SdkName=$(SdkName),SdkNamespace=$(SdkNamespace),GeneratedClientFile=$(GeneratedServiceFile),GeneratedContractFile=$(GeneratedInterfaceFile)" />
</Target>