加载 Blazor 客户端应用程序时如何避免 System.TypeLoadException 浏览器中未处理的异常
How to avoid System.TypeLoadException unhandled exception in browser when loading Blazor client-side application
我有一个客户端 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, Version=0.7.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60' 中的预期 class 'Microsoft.AspNetCore.Blazor.HttpClientJsonExtensions')
我已经尽早在 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;
}
}
依赖项是从我的启动中注入的class
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpClient();
services.AddTransient<IServiceProxy, ServiceProxy>();
}
}
当我 运行 遇到这样的问题时,我会在项目关闭时删除 bin 和 obj 文件夹。我还删除了所有 nuget 包并重新安装它们。
希望对您有所帮助。
客户端 blazor 不支持 IHttpClientFactory
。
客户端 HttpClient
与服务器端或其他版本不同。它是浏览器中 XMLHttpRequest
的包装器。 (另外在打字稿上分层)
[Blazor client-side apps call web APIs using a preconfigured
HttpClient service. Compose requests, which can include JavaScript
Fetch API options, using Blazor JSON helpers or with
HttpRequestMessage.
Blazor server-side apps call web APIs using HttpClient instances
typically created using IHttpClientFactory. For more information, see
Make HTTP requests using IHttpClientFactory in ASP.NET Core.]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
}
我已经找到了这个问题的根本原因,从而找到了解决办法。
我将我的 Visual Studio 2019 升级到 16.4.0 Preview 1.0,然后出了点问题,以前没有。
在整合我的 NuGet 依赖项时,令我感到非常惊讶的是,我的一个 .NET Standard 依赖项项目实际上引用了 Blazor 0.7.0,它比我升级的 Preview 8 版本旧。
这个参考可能是我痛苦的原因!
删除该引用后,我无法再调用 httpClient.PutJsonAsync 和 httpClient.GetJsonAsync,因为这可能仅在 HttpClient 的 Blazor 版本中实现。
我重写了我的库以使用 httpClient.PutAsync 和 httpClient.GetAsync 并使用 Newtonsoft.Json 进行序列化和反序列化。在另外修复了一些 CORS 问题后,它起作用了。
我有一个客户端 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, Version=0.7.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60' 中的预期 class 'Microsoft.AspNetCore.Blazor.HttpClientJsonExtensions')
我已经尽早在 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;
}
}
依赖项是从我的启动中注入的class
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpClient();
services.AddTransient<IServiceProxy, ServiceProxy>();
}
}
当我 运行 遇到这样的问题时,我会在项目关闭时删除 bin 和 obj 文件夹。我还删除了所有 nuget 包并重新安装它们。
希望对您有所帮助。
客户端 blazor 不支持 IHttpClientFactory
。
客户端 HttpClient
与服务器端或其他版本不同。它是浏览器中 XMLHttpRequest
的包装器。 (另外在打字稿上分层)
[Blazor client-side apps call web APIs using a preconfigured HttpClient service. Compose requests, which can include JavaScript Fetch API options, using Blazor JSON helpers or with HttpRequestMessage.
Blazor server-side apps call web APIs using HttpClient instances typically created using IHttpClientFactory. For more information, see Make HTTP requests using IHttpClientFactory in ASP.NET Core.]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
}
我已经找到了这个问题的根本原因,从而找到了解决办法。
我将我的 Visual Studio 2019 升级到 16.4.0 Preview 1.0,然后出了点问题,以前没有。 在整合我的 NuGet 依赖项时,令我感到非常惊讶的是,我的一个 .NET Standard 依赖项项目实际上引用了 Blazor 0.7.0,它比我升级的 Preview 8 版本旧。
这个参考可能是我痛苦的原因! 删除该引用后,我无法再调用 httpClient.PutJsonAsync 和 httpClient.GetJsonAsync,因为这可能仅在 HttpClient 的 Blazor 版本中实现。
我重写了我的库以使用 httpClient.PutAsync 和 httpClient.GetAsync 并使用 Newtonsoft.Json 进行序列化和反序列化。在另外修复了一些 CORS 问题后,它起作用了。