Migración de .NET Core 2 a .NET Core 3: HttpContent no contiene una definición para "ReadAsAsync"

15

Estoy siguiendo esta guía https://docs.microsoft.com/en-us/aspnet/core/migration/22-to-30?view=aspnetcore-3.0&tabs=visual-studio para migrar a .NET Core 3.

Recibo el error de compilación:

El error CS1061 'HttpContent' no contiene una definición para 'ReadAsAsync' y no se puede encontrar ningún método de extensión accesible 'ReadAsAsync' que acepte un primer argumento de tipo 'HttpContent' (¿falta una directiva de uso o una referencia de ensamblado?)

El proyecto es una biblioteca de clases, he actualizado su csproj eliminando una referencia de paquete a Microsoft.AspNetCore.App y agregando una referencia de marco en su lugar:

  <ItemGroup>
    <FrameworkReference Include="Microsoft.AspNetCore.App" />
  </ItemGroup>

¿Alguna idea de por qué está sucediendo esto?

kpocrz
fuente

Respuestas:

34

ReadAsAsynces una extensión .NET Standard que en realidad se comparte entre ASP.NET Core y ASP.NET Web Api (a través de una biblioteca NuGet). Sin embargo, usa JSON.NET para hacer la deserialización, y a partir de .NET Core 3.0, ASP.NET Core ahora usa en su System.Text.Jsonlugar. Como tal, esta biblioteca (y la extensión que contiene) no se incluye en el marco .NET Core 3.0 porque para hacerlo sería necesario incluir la biblioteca JSON.NET además de System.Text.Json.

Si bien puede agregar manualmente el Microsoft.AspNet.WebApi.Client(y Newtonsoft.Jsonjunto con él), debe continuar sin él. De todos modos, no te ahorra mucho, ya que puedes lograr lo mismo a través de:

await JsonSerializer.DeserializeAsync<MyType>(await response.Content.ReadAsStreamAsync());

Si lo desea, puede agregar su propia extensión HttpContentpara concluir esto en un ReadAsAsyncmétodo:

public static class HttpContentExtensions
{
    public static async Task<T> ReadAsAsync<T>(this HttpContent content) =>
        await JsonSerializer.DeserializeAsync<T>(await content.ReadAsStreamAsync());
}
Chris Pratt
fuente
5

ReadAsAsync está en desuso como parte de .NET Core a partir de .NET Core 3.0, sin embargo, puede incluirlo desde el paquete NuGet Microsoft.AspNet.WebApi.Client y podrá usar ReadAsAsync nuevamente. Al actualizar la aplicación web de .NET Core 2.0 a .NET Core 3.0 experimenté el mismo problema.

PícaroPlanetoide
fuente