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

时间:2019-11-20 14:19:55

标签: asp.net-core-3.0 .net-core-3.0

我正在按照本指南https://docs.microsoft.com/en-us/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的包引用,并添加了框架引用:

uintptr_t addr = (uintptr_t)KeGetProcessorNumberFromIndex; // gets address of KeGetProcessorNumberFromIndex_0 

KeGetProcessorNumberFromIndex_0 proc near
jmp     cs:__imp_KeGetProcessorNumberFromIndex
KeGetProcessorNumberFromIndex_0 endp

有任何想法为什么会这样?

3 个答案:

答案 0 :(得分:4)

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框架中,因为这样做需要除System.Text.Json之外还包括JSON.NET库。

虽然您可以手动添加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());
}

答案 1 :(得分:1)

从.NET Core 3.0开始,

ReadAsAsync 已作为.NET Core的一部分被弃用,但是您可以从NuGet包 Microsoft.AspNet.WebApi.Client 中包括它。您将可以再次使用 ReadAsAsync 。将Web应用程序从.NET Core 2.0更新到.NET Core 3.0时,我遇到了同样的问题。

答案 2 :(得分:0)

由于 System.Text.Json 不支持“允许字符串属性的非字符串 JSON 值”,并且我无法找到或编写我自己的可靠 JsonConverter 来实现这一点,继续使用 Newtonsoft.Json 对我来说节省了很多。

在我的解决方案中,Microsoft.AspNet.WebApi.Client 不是必需的,只需 Newtonsoft.Json

原始代码:

return await response.Content.ReadAsAsync<MyClass>();

.NET Core 3 解决方案:

return JsonConvert.DeserializeObject<MyClass>(await response.Content.ReadAsStringAsync());