3

我有一个客户端 Blazor 应用程序,当我尝试从 Visual Studio 2019 16.3.0 Preview 2.0 运行它进行调试时,我在 Chrome 浏览器中收到此错误消息(使用 Shift-Alt-D 调试时看到):

blazor.webassembly.js:1 WASM: System.TypeLoadException: 无法从 typeref 解析带有令牌 01000020 的类型(程序集“Microsoft.AspNetCore.Blazor,版本 = 0.7.0.0,文化中的预期类“Microsoft.AspNetCore.Blazor.HttpClientJsonExtensions” =中性,PublicKeyToken=adb9793829ddae60')

我已经尽早在 Program.cs 的 Main 中设置了一个断点,但这并没有受到影响。

我正在使用 Blazor 版本 3.0.0-preview8.19405.7。我一直在寻找解决这个问题的方法,但所有文章似乎都解决了我以外的其他问题。

这个问题似乎是关于 Json 和 HttpClient 的,所以我认为它可能与升级有关,因为它在过程中提到: https ://devblogs.microsoft.com/aspnet/asp-net-core-and- blazor-updates-in-net-core-3-0-preview-8/

但实际上我在升级之前并没有成功使用 Json(它正在开发中),所以我不确定它是否与此有关。

编辑:我试图从代码中删除这两行(但在项目文件中保留了对 Microsoft.AspNetCore.Blazor.HttpClient 的引用):

result = await httpClient.GetJsonAsync<bool>("uri");

await httpClient.PutJsonAsync("uri", value);

这解决了这个问题,但会导致我没有对我的后端进行任何调用。

那么如何使用httpClient呢?或者我有哪些选择?

编辑:

我在构造函数中使用依赖注入创建 httpClient

public class ServiceProxy : IServiceProxy
{
    private readonly HttpClient httpClient;
    public ServiceProxy(IHttpClientFactory httpClientFactory)
    {
        httpClient = httpClientFactory.CreateClient();
        httpClient.BaseAddress = new Uri("https://localhost:12345"), UriKind.Absolute);
    }

    public async Task<bool> GetResultAsync()
    {
        bool result
        try
        {
            result = await httpClient.GetJsonAsync<bool>("resource");
        }
        catch (HttpRequestException httpRequestException)
        {
            throw new ConnectionException(string.Format("Http Request failed: {0}", httpRequestException.Message), httpRequestException);
        }
        return result;
    }
}

依赖项是从我的启动类中注入的

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddHttpClient();
        services.AddTransient<IServiceProxy, ServiceProxy>();
    }
}
4

3 回答 3

2

我发现了这个问题的根本原因,从而找到了解决方案。

我将我的 Visual Studio 2019 升级到 16.4.0 预览版 1.0,然后出现了一些问题,之前没有出现问题。在整合我的 NuGet 依赖项时,我感到非常惊讶的是,我的一个 .NET Standard 依赖项项目实际上引用了 Blazor 0.7.0,它比我正在升级的 Preview 8 版本更早。

这个参考可能是我痛苦的原因!删除该引用后,我无法再调用我的 httpClient.PutJsonAsync 和 httpClient.GetJsonAsync,因为这可能仅在 Blazor 版本的 HttpClient 中实现。

我重写了我的库以使用 httpClient.PutAsync 和 httpClient.GetAsync 并使用 Newtonsoft.Json 进行序列化和反序列化。在另外修复了一些 CORS 问题之后,它起作用了。

于 2019-09-29T11:24:16.553 回答
1

当我遇到这样的问题时,我会在项目关闭时删除 bin 和 obj 文件夹。我还删除了所有 nuget 包并再次安装它们。

我希望这有帮助。

于 2019-08-23T01:05:36.680 回答
0

客户端 blazor 不支持IHttpClientFactory. 客户端HttpClient与服务器端或其他版本不同。它是浏览器中的包装XMLHttpRequest器。(另外在打字稿上分层)

[Blazor 客户端应用程序使用预配置的 HttpClient 服务调用 Web API。使用 Blazor JSON 帮助程序或 HttpRequestMessage 编写请求,其中可以包括 JavaScript Fetch API 选项。

Blazor 服务器端应用使用通常使用 IHttpClientFactory 创建的 HttpClient 实例调用 Web API。有关详细信息,请参阅在 ASP.NET Core 中使用 IHttpClientFactory 发出 HTTP 请求。] 1

在客户端HttpClient,DI 中包含开箱即用。您可以使用它来进行 http 调用。

将其注入到构造函数中:

private readonly HttpClient _httpClient;

public YourClassName(HttpClient httpClient)
{
    _httpClient = httpClient;
}

//Use the _httpClient in other methods as usual

注入属性

[Inject]
public HttpClient MyHttpClient { get; set; }

注入 Blazor 页面

@inject HttpClient MyHttpClient

code {
   //Use the MyHttpClientin other methods as usual
}

blazor 中 DI 的其他资源

于 2019-08-30T09:47:07.403 回答