通过 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>