HttpClient没有为GetJsonAsync定义

And*_*hke 4 .net c# dotnet-httpclient

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

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

response = await Http.GetJsonAsync<T>(Uri);
Run Code Online (Sandbox Code Playgroud)

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

Dar*_*ell 11

从预览版8开始,您需要:

<PackageReference Include="Microsoft.AspNetCore.Blazor.HttpClient" Version="3.0.0-preview8.19405.7" PrivateAssets="all" />


Joh*_*hnB 11

很好的问题。我假设 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
Run Code Online (Sandbox Code Playgroud)

B. 如果您想将该类放入单独的项目(.NET Core 库)中,则还需要添加 NuGet 包:

NuGet 包: System.Net.Http.Json

然后你可以在你的班级中使用它,就像下面的例子一样。显然这些扩展方法正在做序列化,但有趣的是包不依赖,Newtonsoft.Json 因为它使用 newSystem.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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • TLDR:添加 `using System.Net.Http.Json;` 并且不要忘记将 `GetJsonAsync` 更改为 `GetFromJsonAsync`。 (2认同)

小智 10

截至今天,正确答案是:

using System.Net.Http.Json
Run Code Online (Sandbox Code Playgroud)

GetFromJsonAsync()
Run Code Online (Sandbox Code Playgroud)