Migracja .NET Core 2 do .NET Core 3: HttpContent nie zawiera definicji „ReadAsAsync”

15

Postępuję zgodnie z tym przewodnikiem https://docs.microsoft.com/en-us/aspnet/core/migration/22-to-30?view=aspnetcore-3.0&tabs=visual-studio, aby przeprowadzić migrację do .NET Core 3.

Otrzymuję błąd kompilacji:

Błąd CS1061 „HttpContent” nie zawiera definicji „ReadAsAsync” i nie można znaleźć żadnej dostępnej metody rozszerzenia „ReadAsAsync” akceptującej pierwszy argument typu „HttpContent” (czy brakuje Ci dyrektywy lub odwołania do zestawu?)

Projekt jest biblioteką klas, zaktualizowałem jego csproj, usuwając odwołanie do pakietu do Microsoft.AspNetCore.App i dodając zamiast tego odwołanie do ramy:

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

Wszelkie pomysły, dlaczego tak się dzieje?

kpocrz
źródło

Odpowiedzi:

34

ReadAsAsyncjest rozszerzeniem .NET Standard, które jest faktycznie współużytkowane przez ASP.NET Core i ASP.NET Web Api (za pośrednictwem biblioteki NuGet). Jednak korzysta z JSON.NET do przeprowadzenia deserializacji, a od .NET Core 3.0, ASP.NET Core teraz używa System.Text.Jsonzamiast tego. Jako taka, ta biblioteka (i zawarte w niej rozszerzenie) nie jest zawarta w środowisku .NET Core 3.0, ponieważ wymagałoby to oprócz tego dołączenia biblioteki JSON.NET System.Text.Json.

Chociaż możesz ręcznie dodać Microsoft.AspNet.WebApi.Client(i Newtonsoft.Jsonwraz z nim), powinieneś po prostu przejść bez niego. I tak nie oszczędza dużo, ponieważ możesz to zrobić tylko:

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

Jeśli chcesz, możesz dodać własne rozszerzenie, HttpContentaby zakończyć to ReadAsAsyncmetodą:

public static class HttpContentExtensions
{
    public static async Task<T> ReadAsAsync<T>(this HttpContent content) =>
        await JsonSerializer.DeserializeAsync<T>(await content.ReadAsStreamAsync());
}
Chris Pratt
źródło
5

ReadAsAsync jest przestarzałe jako część .NET Core od .NET Core 3.0, jednak możesz dołączyć go z pakietu NuGet Microsoft.AspNet.WebApi.Client i będziesz mógł ponownie użyć ReadAsAsync . Podczas aktualizacji aplikacji internetowej z .NET Core 2.0 do .NET Core 3.0 wystąpił ten sam problem.

RoguePlanetoid
źródło