Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 加载Blazor客户端应用程序时如何避免System.TypeLoadException浏览器中未处理的异常_C#_Webassembly_Blazor_Blazor Client Side - Fatal编程技术网

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

C# 加载Blazor客户端应用程序时如何避免System.TypeLoadException浏览器中未处理的异常,c#,webassembly,blazor,blazor-client-side,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解析带有标记01000020的类型(程序集Microsoft.AspNetCore.blazor.HttpClientJsonExtensions

我有一个客户端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.HttpClientJsonExtensions中的类应为“Microsoft.AspNetCore.blazor”,版本=0.7.0.0,区域性=中性,PublicKeyToken=adb9793829ddae60”)

我已经尽可能早地在Program.cs的Main中设置了一个断点,但这个断点没有被命中

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

问题似乎与Json和HttpClient有关,因此我认为这可能与升级有关,因为过程中提到了这一点:

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

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

这解决了问题,但将导致我没有任何呼叫到我的后端

那么如何使用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;
    }
}
公共类服务代理:IServiceProxy
{
私有只读HttpClient HttpClient;
公共服务代理(IHttpClientFactory httpClientFactory)
{
httpClient=httpClientFactory.CreateClient();
httpClient.BaseAddress=新Uri(“https://localhost:12345(),乌里金。绝对);
}
公共异步任务GetResultAsync()
{
布尔结果
尝试
{
结果=等待httpClient.GetJsonAsync(“资源”);
}
捕获(HttpRequestException HttpRequestException)
{
抛出新的ConnectionException(string.Format(“Http请求失败:{0}”、httpRequestException.Message)、httpRequestException);
}
返回结果;
}
}
依赖项是从我的启动类注入的

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddHttpClient();
        services.AddTransient<IServiceProxy, ServiceProxy>();
    }
}
公共类启动
{
public void配置服务(IServiceCollection服务)
{
services.AddHttpClient();
services.AddTransient();
}
}

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


我希望这有帮助。

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

[Blazor客户端应用程序使用预配置的 编写请求,其中可以包括JavaScript 使用Blazor JSON帮助程序或 HttpRequestMessage

Blazor服务器端应用程序使用HttpClient实例调用web API 通常使用IHttpClientFactory创建。有关更多信息,请参阅 使用ASP.NET Core中的IHttpClientFactory发出HTTP请求。]

在客户端,
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
}

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

我将我的VisualStudio2019升级到16.4.0 Preview 1.0,然后出现了以前没有出现过的问题。 当整合我的NuGet依赖项时,我非常惊讶我的一个.NET标准依赖项项目实际上引用了Blazor 0.7.0,它比我升级的Preview 8版本要旧

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


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

您是否添加了
Microsoft.AspNetCore.Blazor.HttpClient
包,它的版本是否正确?请参阅升级博客:是的,我的项目文件中有一行:
确定,然后选中该行。我不知道还能是什么。谢谢你的帮助。我将不得不做更多的调查,看看我是否可以让它再次运行,如果我这样做,会有什么把戏。如果我更接近解决方案,我会进行更新。我只是想检查一下,您是否使用.net core 3 sdk preview 8?我以前做过这项工作,我仔细检查了一下。这并不能解决问题。但是感谢您尝试一下。当您创建一个新的Blazor项目并运行它时,会发生这种情况吗?我曾经遇到过这样的问题:我需要创建一个新项目,确保它能够编译,然后修改我的startup.cs,确保它能够运行,然后复制我的模型、服务和组件等。我希望不这样做就能够找到错误,但这可能是唯一的方法。我实际上可以让Blazor模板(用于客户端和服务器)运行,我验证了这一点,但是其中有很多东西,我不需要。当我试图在模板上构建自己的功能,试图隔离问题时,我希望更新这篇文章。非常感谢你的回答。我相信这是必要的,但不幸的是,这还不够。我已经实现了使用DI中包含的客户端
HttpClient
,但是
[Inject]
public HttpClient MyHttpClient { get; set; }
@inject HttpClient MyHttpClient

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