Reputation: 73
After autogenerating client using Swagger OpenApi 3.0 spec, I'm unable to compile the generated client. I get error on objects 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;
}
}
}
Also, getting error in below autogenerated serialization class on IUtf8JsonSerializable and Optional.
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();
}
}
}
This project using .net 5, autorest v3.1.0, cli v3.1.2 and node v14.15.5.
What am I missing?
Upvotes: 7
Views: 4031
Reputation: 1909
Ran into the same problems when upgrading a codebase to dotnet 8.0, and found a lot of solutions still using the outdaged package-store url and older versions.
Here is the 2024 version for generating with AutoREst:
<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>
This uses the new package source url (https://pkgs.dev.azure.com/azure-sdk/public/_packaging/azure-sdk-for-net/nuget/v3/index.json) and at time of writing, the 3.0.0-beta.20240429.2 version of Microsoft.Azure.AutoRest.CSharp is the most recent one.
Going back to the question, the problem is that the files AutoRest generates depend on other code in the Azure.Core and Microsoft.Azure.AutoRest.CSharp libraries. These files however have classes that are marked as internal, meaning you cannot just use them, they have to be inside your project and of the correct version.
Using the <RestoreAdditionalProjectSources>
tag allows you to pull the Microsoft.Azure.AutoRest.CSharp
from another package feed (since it doesn't exist on the default NuGet feed) and the url with the latest versions is now the one in my code above.
The <IncludeGeneratorSharedCode>
tag basically creates directories inside your solution (Shared/Core
and 'Shared/Autorest') that point to the Nuget Package location on your disk. The AutoRest generated files use this code and allows you to build as normal.
Upvotes: 2
Reputation: 4285
I have add only this changes and it works
<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>
For the client creation i use this
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"));
}
Upvotes: 10
Reputation: 76
It seems new autorest requires some changes in csproj.
For my case, I had to change it to
<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>
Upvotes: 6