编译 Autorest 生成的客户端时出错

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

使用 Swagger OpenApi 3.0 规范自动生成客户端后,我无法编译生成的客户端。我在对象 ClientDiagnosticsRawRequestUriBuilderUtf8JsonRequestContent 上收到错误。

RestClient.cs

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

// <auto-generated/>

#nullable disable

using System;
using System.Collections.Generic;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using Azure;
using Azure.Core;
using Azure.Core.Pipeline;
using Planner.Client.Models;

namespace Planner.Client
{
    internal partial class RestClient
    {
        private Uri endpoint;
        private ClientDiagnostics _clientDiagnostics;
        private HttpPipeline _pipeline;

        /// <summary> Initializes a new instance of RestClient. </summary>
        /// <param name="clientDiagnostics"> The handler for diagnostic messaging in the client. </param>
        /// <param name="pipeline"> The HTTP pipeline for sending and receiving REST requests and responses. </param>
        /// <param name="endpoint"> server parameter. </param>
        public RestClient(ClientDiagnostics clientDiagnostics, HttpPipeline pipeline, Uri endpoint = null)
        {
            endpoint ??= new Uri("https://localhost:49157");

            this.endpoint = endpoint;
            _clientDiagnostics = clientDiagnostics;
            _pipeline = pipeline;
        }


        internal HttpMessage CreateCreateDataRequest(IEnumerable<DataCreateModel> body)
        {
            var message = _pipeline.CreateMessage();
            var request = message.Request;
            request.Method = RequestMethod.Post;
            var uri = new RawRequestUriBuilder();
            uri.Reset(endpoint);
            uri.AppendPath("/api/Budget/CreateData", false);
            request.Uri = uri;
            if (body != null)
            {
                request.Headers.Add("Content-Type", "application/json");
                var content = new Utf8JsonRequestContent();
                content.JsonWriter.WriteStartArray();
                foreach (var item in body)
                {
                    content.JsonWriter.WriteObjectValue(item);
                }
                content.JsonWriter.WriteEndArray();
                request.Content = content;
            }
            return message;
        }
    }
}

此外,在 IUtf8JsonSerializedOptional 上自动生成的序列化类中出现错误。

DataCreateModel.Serialization.cs

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

// <auto-generated/>

#nullable disable

using System.Text.Json;
using Azure.Core;

namespace Planner.Client.Models
{
    public partial class DataCreateModel : IUtf8JsonSerializable
    {
        void IUtf8JsonSerializable.Write(Utf8JsonWriter writer)
        {
            writer.WriteStartObject();
            if (Optional.IsDefined(ProjectCode))
            {
                if (ProjectCode != null)
                {
                    writer.WritePropertyName("projectCode");
                    writer.WriteStringValue(ProjectCode);
                }
                else
                {
                    writer.WriteNull("projectCode");
                }
            }
            if (Optional.IsDefined(TeamCode))
            {
                if (TeamCode != null)
                {
                    writer.WritePropertyName("teamCode");
                    writer.WriteStringValue(TeamCode);
                }
                else
                {
                    writer.WriteNull("teamCode");
                }
            }
            if (Optional.IsDefined(YearMonth))
            {
                writer.WritePropertyName("yearMonth");
                writer.WriteNumberValue(YearMonth.Value);
            }
            if (Optional.IsDefined(Hours))
            {
                writer.WritePropertyName("hours");
                writer.WriteNumberValue(Hours.Value);
            }
            writer.WriteEndObject();
        }
    }
}

该项目使用.net 5、autorest v3.1.0、cli v3.1.2和node v14.15.5。

我错过了什么?

c# autorest
3个回答
9
投票

我只添加了这个更改并且它有效

<PropertyGroup>
  <IncludeGeneratorSharedCode>true</IncludeGeneratorSharedCode>
  <RestoreAdditionalProjectSources>https://azuresdkartifacts.blob.core.windows.net/azure-sdk-tools/index.json</RestoreAdditionalProjectSources>
</PropertyGroup>

<ItemGroup>
  <PackageReference Include="Azure.Core" Version="1.10.0" />
  <PackageReference Include="Microsoft.Azure.AutoRest.CSharp" Version="3.0.0-beta.20210311.1" PrivateAssets="All" />
</ItemGroup>

对于客户端创建,我使用这个

class MyClientOptions : ClientOptions
{
}

static void Main(string[] args)
{
    var client = new TestRestClient(
        new ClientDiagnostics(new MyClientOptions()),
        new HttpPipeline(HttpClientTransport.Shared),
        new Uri("https://api.domain.com"));
}

6
投票

新的自动休息似乎需要对 csproj 进行一些更改。

对于我的情况,我必须将其更改为

<PropertyGroup>
  <TargetFramework>netstandard2.0</TargetFramework>
  <Nullable>annotations</Nullable>
  <IncludeGeneratorSharedCode>true</IncludeGeneratorSharedCode>
  <RestoreAdditionalProjectSources>https://azuresdkartifacts.blob.core.windows.net/azure-sdk-tools/index.json</RestoreAdditionalProjectSources>
  <LangVersion>8</LangVersion>
</PropertyGroup>
  
<ItemGroup>
  <PackageReference Include="Azure.Core" Version="1.10.0" />
  <PackageReference Include="Microsoft.Azure.AutoRest.CSharp" Version="3.0.0-beta.20210311.1" PrivateAssets="All" />
</ItemGroup>

0
投票

在将代码库升级到 dotnet 8.0 时遇到了同样的问题,并发现很多解决方案仍然使用过时的包存储 url 和旧版本。

这是使用 AutoREst 生成的 2024 版本:

<PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <Nullable>annotations</Nullable>
    <LangVersion>11.0</LangVersion>
    <IncludeGeneratorSharedCode>true</IncludeGeneratorSharedCode>
    <RestoreAdditionalProjectSources>https://pkgs.dev.azure.com/azure-sdk/public/_packaging/azure-sdk-for-net/nuget/v3/index.json</RestoreAdditionalProjectSources>
</PropertyGroup>

<ItemGroup>
    <PackageReference Include="Azure.Core" Version="1.39.0" />
    <PackageReference Include="Microsoft.Azure.AutoRest.CSharp" Version="3.0.0-beta.20240429.2" PrivateAssets="All" />
</ItemGroup>

这使用新的包源 URL (https://pkgs.dev.azure.com/azure-sdk/public/_packaging/azure-sdk-for-net/nuget/v3/index.json)在撰写本文时,Microsoft.Azure.AutoRest.CSharp 的 3.0.0-beta.20240429.2 版本是最新版本。

回到问题,问题在于AutoRest生成的文件依赖于Azure.Core和Microsoft.Azure.AutoRest.CSharp库中的其他代码。然而,这些文件的类被标记为内部,这意味着您不能只使用它们,它们必须位于您的项目中并且具有正确的版本。 使用 <RestoreAdditionalProjectSources>

标签允许您从另一个包提要中提取

Microsoft.Azure.AutoRest.CSharp

(因为默认 NuGet 提要中不存在它),并且包含最新版本的 url 现在是我上面的代码中的 URL。
<IncludeGeneratorSharedCode>
 标签基本上会在解决方案中创建指向磁盘上 Nuget 包位置的目录(
Shared/Core
 和“共享/自动休息”)。 AutoRest 生成的文件使用此代码并允许您正常构建。

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