编译 Autorest 生成的客户端时出错
Error compiling Autorest Generated Client
使用 Swagger OpenApi 3.0 规范自动生成客户端后,我无法编译生成的客户端。我在对象 ClientDiagnostics、RawRequestUriBuilder、Utf8JsonRequestContent.
上出错
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;
}
}
}
此外,在 IUtf8JsonSerializable 和 Optional.
下自动生成的序列化 class 中出现错误
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。
我错过了什么?
似乎新的 autorest 需要对 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>
我只添加了这个更改并且有效
<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"));
}
使用 Swagger OpenApi 3.0 规范自动生成客户端后,我无法编译生成的客户端。我在对象 ClientDiagnostics、RawRequestUriBuilder、Utf8JsonRequestContent.
上出错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;
}
}
}
此外,在 IUtf8JsonSerializable 和 Optional.
下自动生成的序列化 class 中出现错误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。
我错过了什么?
似乎新的 autorest 需要对 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>
我只添加了这个更改并且有效
<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"));
}