我正在按照本指南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
有任何想法为什么会这样?
答案 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)
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());