加载Blazor客户端应用程序时如何避免浏览器中出现System.TypeLoadException未处理的异常

时间:2019-08-20 18:59:42

标签: c# webassembly blazor blazor-client-side

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

blazor.webassembly.js:1 WASM:System.TypeLoadException:无法解析来自typeref(组件'Microsoft.AspNetCore.Blazor中的预期类'Microsoft.AspNetCore.Blazor.HttpClientJsonExtensions'的令牌01000020的类型,版本= 0.7。 0.0,Culture = neutral,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>();
    }
}

3 个答案:

答案 0 :(得分:1)

遇到类似问题时,我将在项目关闭时删除bin和obj文件夹。我还将删除所有nuget软件包,然后重新安装它们。

我希望这会有所帮助。

答案 1 :(得分:1)

我已经找到了此问题的根本原因,从而找到了解决方案。

我将我的Visual Studio 2019升级到16.4.0预览版1.0,然后发生了故障,但之前没有发生故障。 当整合我的NuGet依赖项时,我非常惊讶我的一个.NET Standard依赖项项目实际上引用了Blazor 0.7.0,该版本早于我要升级的Preview 8版本。

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

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

答案 2 :(得分:0)

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

  

[Blazor客户端应用程序使用预先配置的调用Web API   HttpClient服务。撰写请求,其中可能包含JavaScript   使用Blazor JSON帮助器或通过以下方式获取API选项   HttpRequestMessage。

     

Blazor服务器端应用程序使用HttpClient实例调用Web API   通常使用IHttpClientFactory创建。有关更多信息,请参见   使用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; }

注入到辉煌的页面

@inject HttpClient MyHttpClient

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

Additional resources for DI in blazor