HttpClient没有为GetJsonAsync定义

时间:2019-05-15 11:43:38

标签: c# .net dotnet-httpclient

我目前正在使用Blazor,并希望移动我的代码,以使其更具可读性和可重用性。在我的剃须刀组件中,方法完美无缺-在类中却无效。

在我的组件中,我可以简单地使用它:

response = await Http.GetJsonAsync<T>(Uri);

在我的课堂上,Visual Studio抱怨System.Net.Http的HttpClient不包含GetJsonAsync的定义-但我收到类型化的响应,因此我想对其进行反序列化。

6 个答案:

答案 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)可用于为您提供相同的扩展方法。

参考:https://learn-blazor.com/architecture/rest-api/

答案 4 :(得分:2)

只需下载Microsoft.AspNetCore.Blazor.HttpClient软件包。

答案 5 :(得分:2)

截至今天,正确答案是:

using System.Net.Http.Json

GetFromJsonAsync()