将.NET Core 2迁移到.NET Core 3:HttpContent不包含“ ReadAsAsync”的定义


15

我正在按照本指南https://docs.microsoft.com/zh-cn/aspnet/core/migration/22-to-30?view=aspnetcore-3.0&tabs=visual-studio迁移到.NET Core 3。

我收到编译错误:

错误CS1061'HttpContent'不包含'ReadAsAsync'的定义,并且找不到可访问的扩展方法'ReadAsAsync'接受类型为'HttpContent'的第一个参数(您是否缺少using指令或程序集引用?)

该项目是一个类库,我更新了它的csproj,删除了对Microsoft.AspNetCore.App的包引用,并添加了框架引用:

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

任何想法为什么会这样?

Answers:


34

ReadAsAsync是.NET Standard扩展,实际上是在ASP.NET Core和ASP.NET Web Api之间共享的(通过NuGet库)。但是,它使用JSON.NET进行反序列化,从.NET Core 3.0开始,ASP.NET Core现在System.Text.Json改为使用。因此,该库(及其包含的扩展名)未包含在.NET Core 3.0框架中,因为这样做需要除之外还包括JSON.NET库System.Text.Json

虽然您可以手动添加Microsoft.AspNet.WebApi.Client(以及Newtonsoft.Json随之添加),但是您应该继续添加它。无论如何,它并不能为您节省很多,因为您可以通过以下方式完成相同的操作:

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

如果愿意,可以添加自己的扩展名以HttpContent将其包装在一个ReadAsAsync方法中:

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

5

从.NET Core 3.0开始不建议将ReadAsAsync作为.NET Core的一部分,但是您可以从NuGet包Microsoft.AspNet.WebApi.Client中将其包括在内,您将可以再次使用ReadAsAsync。将Web应用程序从.NET Core 2.0更新到.NET Core 3.0时,我遇到了相同的问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.