HttpClient 没有 GetJsonAsync 的定义
HttpClient has no definition for GetJsonAsync
我目前正在使用 Blazor,并希望移动我的代码以使其更具可读性和可重用性。在我的剃须刀组件中,该方法完美运行 - 在 Class 中,它没有。
在我的组件中,我可以简单地使用这个:
response = await Http.GetJsonAsync<T>(Uri);
在我的 Class 中,Visual Studio 抱怨 System.Net.Http 的 HttpClient 不包含 GetJsonAsync 的定义 - 但我收到的是类型化响应,所以我想正确反序列化它.
对于 Blazor,有一个扩展 class (Microsoft.AspNetCore.Blazor.HttpClientJsonExtensions) 可以让您获得相同的扩展方法。
从预览版 8 开始,您需要:
<PackageReference Include="Microsoft.AspNetCore.Blazor.HttpClient" Version="3.0.0-preview8.19405.7" PrivateAssets="all" />
注意:这在当时是正确的,但从 Blazor 版本 3.1.0 开始,这可能又发生了变化,因此现在您很可能需要 System.Net.Http.Json
包。请参阅下面@JohnB 的回答。
只需下载 Microsoft.AspNetCore.Blazor.HttpClient 包。
值得注意的是"include prerelease"必须检查才能找到这个包。我刚花了半个小时,因为找不到包裹而非常生气,并搜索 google 找出原因!
好问题。我假设 Darrell 的回答(和其他人)在 3.0.0 版(Blazor WebAssembly 预览版)中是 100% 正确的。
不过3.1.301版本我觉得包位置变了
目前,命名空间是:System.Net.Http.Json
这将使您可以访问:HttpClientJsonExtensions
一个。如果您想将该代码放入 Blazor WebAssembly 项目中的单独 class 中,您只需将其放在 class 文件的顶部:
using System.Net.Http; // for HttpClient
using System.Net.Http.Json; // for HttpClientJsonExtensions
乙。如果要将 class 放入单独的项目(.NET Core 库)中,则还需要添加 NuGet 包:
NuGet 包:System.Net.Http.Json
然后您可以在 class 中使用它,如下例所示。很明显这些扩展方法是在做序列化,但是有趣的是这个包并不依赖于Newtonsoft.Json
,因为它使用了新的System.Text.Json
。
using System;
using System.Net.Http;
using System.Net.Http.Json;
using System.Threading.Tasks;
namespace MyClassLibrary
{
public class MyClass
{
public async Task MyMethod()
{
string baseAddress = "http://localhost:57012/";
var httpClient = new HttpClient() { BaseAddress = new Uri(baseAddress) };
var myPocos = await httpClient.GetFromJsonAsync<MyPoco[]>("api/mypocos");
foreach (var myPoco in myPocos)
Console.WriteLine($"Id: {myPoco.Id}, Name: {myPoco.Name}");
}
}
public class MyPoco
{
public int Id { get; set; }
public string Name { get; set; }
}
}
- 关于 System.text.json VS Newtonsoft.json 与 Utf8Json 的文章。
截至今天,正确答案是:
using System.Net.Http.Json
和
GetFromJsonAsync()
我目前正在使用 Blazor,并希望移动我的代码以使其更具可读性和可重用性。在我的剃须刀组件中,该方法完美运行 - 在 Class 中,它没有。
在我的组件中,我可以简单地使用这个:
response = await Http.GetJsonAsync<T>(Uri);
在我的 Class 中,Visual Studio 抱怨 System.Net.Http 的 HttpClient 不包含 GetJsonAsync 的定义 - 但我收到的是类型化响应,所以我想正确反序列化它.
对于 Blazor,有一个扩展 class (Microsoft.AspNetCore.Blazor.HttpClientJsonExtensions) 可以让您获得相同的扩展方法。
从预览版 8 开始,您需要:
<PackageReference Include="Microsoft.AspNetCore.Blazor.HttpClient" Version="3.0.0-preview8.19405.7" PrivateAssets="all" />
注意:这在当时是正确的,但从 Blazor 版本 3.1.0 开始,这可能又发生了变化,因此现在您很可能需要 System.Net.Http.Json
包。请参阅下面@JohnB 的回答。
只需下载 Microsoft.AspNetCore.Blazor.HttpClient 包。
值得注意的是"include prerelease"必须检查才能找到这个包。我刚花了半个小时,因为找不到包裹而非常生气,并搜索 google 找出原因!
好问题。我假设 Darrell 的回答(和其他人)在 3.0.0 版(Blazor WebAssembly 预览版)中是 100% 正确的。
不过3.1.301版本我觉得包位置变了
目前,命名空间是:System.Net.Http.Json
这将使您可以访问:HttpClientJsonExtensions
一个。如果您想将该代码放入 Blazor WebAssembly 项目中的单独 class 中,您只需将其放在 class 文件的顶部:
using System.Net.Http; // for HttpClient
using System.Net.Http.Json; // for HttpClientJsonExtensions
乙。如果要将 class 放入单独的项目(.NET Core 库)中,则还需要添加 NuGet 包:
NuGet 包:System.Net.Http.Json
然后您可以在 class 中使用它,如下例所示。很明显这些扩展方法是在做序列化,但是有趣的是这个包并不依赖于Newtonsoft.Json
,因为它使用了新的System.Text.Json
。
using System;
using System.Net.Http;
using System.Net.Http.Json;
using System.Threading.Tasks;
namespace MyClassLibrary
{
public class MyClass
{
public async Task MyMethod()
{
string baseAddress = "http://localhost:57012/";
var httpClient = new HttpClient() { BaseAddress = new Uri(baseAddress) };
var myPocos = await httpClient.GetFromJsonAsync<MyPoco[]>("api/mypocos");
foreach (var myPoco in myPocos)
Console.WriteLine($"Id: {myPoco.Id}, Name: {myPoco.Name}");
}
}
public class MyPoco
{
public int Id { get; set; }
public string Name { get; set; }
}
}
- 关于 System.text.json VS Newtonsoft.json 与 Utf8Json 的文章。
截至今天,正确答案是:
using System.Net.Http.Json
和
GetFromJsonAsync()