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) 可以让您获得相同的扩展方法。

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

从预览版 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; }
    }
}

截至今天,正确答案是:

using System.Net.Http.Json

GetFromJsonAsync()