我目前正在使用Blazor,并希望移动我的代码,以使其更具可读性和可重用性。在我的剃须刀组件中,方法完美无缺-在类中却无效。
在我的组件中,我可以简单地使用它:
response = await Http.GetJsonAsync<T>(Uri);
在我的课堂上,Visual Studio抱怨System.Net.Http的HttpClient不包含GetJsonAsync的定义-但我收到类型化的响应,因此我想对其进行反序列化。
答案 0 :(得分:13)
从预览版8开始,您需要:
<PackageReference Include="Microsoft.AspNetCore.Blazor.HttpClient" Version="3.0.0-preview8.19405.7" PrivateAssets="all" />
答案 1 :(得分:6)
好问题。我假设Darrell的答案(和其他答案)在3.0.0版(Blazor WebAssembly预览版)中是100%正确的。
但是,对于3.1.301版本,我认为程序包的位置已更改。
当前,名称空间为:System.Net.Http.Json
这将使您可以访问:HttpClientJsonExtensions
A。如果要将代码放在Blazor WebAssembly项目中的单独类中,只需将其放在类文件的顶部即可。
using System.Net.Http; // for HttpClient
using System.Net.Http.Json; // for HttpClientJsonExtensions
B。如果要将该类放入一个单独的项目(.NET Core库)中,则还需要添加NuGet包:
NuGet软件包:System.Net.Http.Json
然后,您可以像下面的示例一样在班级中使用它。显然,这些扩展方法正在进行序列化,但是有趣的是该软件包不依赖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; }
}
}
答案 2 :(得分:3)
值得注意的是,必须选中“ include prerelease”才能找到此软件包。我只花了半个小时就很生气,因为找不到该软件包,并向Google搜寻以找出原因!
答案 3 :(得分:2)
对于Blazor,有一个扩展类(Microsoft.AspNetCore.Blazor.HttpClientJsonExtensions)可用于为您提供相同的扩展方法。
答案 4 :(得分:2)
只需下载Microsoft.AspNetCore.Blazor.HttpClient软件包。
答案 5 :(得分:2)
截至今天,正确答案是:
using System.Net.Http.Json
和
GetFromJsonAsync()