Migrando o .NET Core 2 para o .NET Core 3: HttpContent não contém uma definição para "ReadAsAsync"

15

Estou seguindo este guia https://docs.microsoft.com/en-us/aspnet/core/migration/22-to-30?view=aspnetcore-3.0&tabs=visual-studio para migrar para o .NET Core 3.

Estou recebendo o erro de compilação:

O erro CS1061 'HttpContent' não contém uma definição para 'ReadAsAsync' e não foi encontrado nenhum método de extensão acessível 'ReadAsAsync' que aceite um primeiro argumento do tipo 'HttpContent' (está faltando uma diretiva de uso ou uma referência de montagem?)

O projeto é uma biblioteca de classes. Atualizei seu csproj removendo uma referência de pacote para Microsoft.AspNetCore.App e adicionando uma referência de estrutura:

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

Alguma idéia de por que isso está acontecendo?

kpocrz
fonte

Respostas:

34

ReadAsAsyncé uma extensão do .NET Standard que é realmente compartilhada entre o ASP.NET Core e o ASP.NET Web Api (por meio de uma biblioteca do NuGet). No entanto, ele usa o JSON.NET para fazer a desserialização e, a partir do .NET Core 3.0, o ASP.NET Core agora usa System.Text.Json. Como tal, esta biblioteca (e a extensão que ela contém) não está incluída na estrutura do .NET Core 3.0, pois isso exigiria a inclusão da biblioteca JSON.NET, além deSystem.Text.Json .

Enquanto você pode adicionar manualmente o Microsoft.AspNet.WebApi.Client(e Newtonsoft.Jsonjunto com ele), você deve seguir em frente sem ele. De qualquer forma, não poupa muito, pois você pode realizar o mesmo via apenas:

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

Se desejar, você pode adicionar sua própria extensão HttpContentpara encerrar isso em um 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
fonte
5

O ReadAsAsync foi descontinuado por fazer parte do .NET Core a partir do .NET Core 3.0. No entanto, você pode incluí-lo no pacote NuGet Microsoft.AspNet.WebApi.Client e poderá usar o ReadAsAsync novamente. Ao atualizar o aplicativo Web do .NET Core 2.0 para o .NET Core 3.0, tive o mesmo problema.

RoguePlanetoid
fonte