Migration de .NET Core 2 vers .NET Core 3: HttpContent ne contient pas de définition pour «ReadAsAsync»

15

Je suis ce guide https://docs.microsoft.com/en-us/aspnet/core/migration/22-to-30?view=aspnetcore-3.0&tabs=visual-studio pour migrer vers .NET Core 3.

Je reçois l'erreur de compilation:

L'erreur CS1061 'HttpContent' ne contient pas de définition pour 'ReadAsAsync' et aucune méthode d'extension accessible 'ReadAsAsync' acceptant un premier argument de type 'HttpContent' n'a pu être trouvée (vous manque une directive using ou une référence d'assembly?)

Le projet est une bibliothèque de classes, j'ai mis à jour son csproj en supprimant une référence de package à Microsoft.AspNetCore.App et en ajoutant une référence de framework à la place:

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

Des idées pourquoi cela se produit?

kpocrz
la source

Réponses:

34

ReadAsAsyncest une extension .NET Standard qui est réellement partagée entre ASP.NET Core et ASP.NET Web Api (via une bibliothèque NuGet). Cependant, il utilise JSON.NET pour effectuer la désérialisation, et à partir de .NET Core 3.0, ASP.NET Core utilise désormais à la System.Text.Jsonplace. En tant que telle, cette bibliothèque (et l'extension qu'elle contient) n'est pas incluse dans le framework .NET Core 3.0 car cela nécessiterait d'inclure la bibliothèque JSON.NET en plus de System.Text.Json.

Bien que vous puissiez ajouter manuellement le Microsoft.AspNet.WebApi.Client(et Newtonsoft.Jsonavec lui), vous devez simplement continuer sans. Cela ne vous économise pas beaucoup de toute façon, car vous pouvez accomplir la même chose via simplement:

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

Si vous le souhaitez, vous pouvez ajouter votre propre extension à HttpContentpour conclure dans une ReadAsAsyncméthode:

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

ReadAsAsync est déconseillé comme faisant partie de .NET Core à partir de .NET Core 3.0, mais vous pouvez l'inclure à partir du package NuGet Microsoft.AspNet.WebApi.Client et vous pourrez réutiliser ReadAsAsync . Lors de la mise à jour d'une application Web de .NET Core 2.0 vers .NET Core 3.0, j'ai rencontré le même problème.

RoguePlanetoid
la source