我尝试在webassembly上运行我的blazor应用程序时从单声道平台获得System.PlatformNotSupportedException
。
我使用Autorest自动生成了一个web api客户端。一切都很好编译但是当我在浏览器中加载代码时,我在浏览器控制台中得到了以下错误。
使用VS2017的预览版本。
module.printErr @ MonoPlatform.ts:192
WASM: [System.PlatformNotSupportedException] Operation is not supported on this platform.
WASM: at System.Net.WebProxy.CreateDefaultProxy () <0x204ed08 + 0x00004> in <1c80af700ca2462a80a92d89ad803d6a>:0
WASM: at System.Net.Configuration.DefaultProxySectionInternal.GetSystemWebProxy () <0x204ebc0 + 0x00000> in <1c80af700ca2462a80a92d89ad803d6a>:0
WASM: at System.Net.Configuration.DefaultProxySectionInternal.GetDefaultProxy_UsingOldMonoCode () <0x204ea80 + 0x00000> in <1c80af700ca2462a80a92d89ad803d6a>:0
WASM: at System.Net.Configuration.DefaultProxySectionInternal.GetSection () <0x204e8c8 + 0x00022> in <1c80af700ca2462a80a92d89ad803d6a>:0
WASM: at System.Net.WebRequest.get_InternalDefaultWebProxy () <0x204e610 + 0x0002c> in <1c80af700ca2462a80a92d89ad803d6a>:0
WASM: at System.Net.HttpWebRequest..ctor (System.Uri uri) <0x2043eb0 + 0x000d2> in <1c80af700ca2462a80a92d89ad803d6a>:0
WASM: at System.Net.Http.HttpClientHandler.CreateWebRequest (System.Net.Http.HttpRequestMessage request) <0x20434d0 + 0x00016> in <3a9393eaef104ec489024eb855a8f163>:0
WASM: at System.Net.Http.HttpClientHandler+<SendAsync>d__64.MoveNext () <0x203ea60 + 0x00076> in <3a9393eaef104ec489024eb855a8f163>:0
WASM: --- End of stack trace from previous location where exception was thrown ---
...
答案 0 :(得分:0)
Blazor / webassembly应用程序在浏览器沙箱中运行,因此仅限于浏览器网络的可能性。这意味着所有网络流量都需要通过浏览器网络请求系统。
看起来它试图使用代理..这是不受支持的。
答案 1 :(得分:0)
是的,这是可能的。但是你必须使用由blazor框架注入的HttpClient,如下所述:
https://learn-blazor.com/architecture/rest-api/
(感谢链接Flores!)
HttpClient在Autorest使用的Microsoft.Rest.ServiceClient中标记为受保护。因此,要从blazor注入HttpClient,您可以创建自动生成的客户端类的新部分并添加SetHttpClient
方法:
autorest生成的类:
public partial class YourApi : ServiceClient<YourApi>, IYourApi
{
...
}
你的新部分:
public partial class YourApi
{
public void SetHttpClient(HttpClient client) {
this.HttpClient = client;
}
}
美好而简单!
答案 2 :(得分:0)
现在,使用Refit更容易。
const string baseUri = "http://localhost:55088/";
services.AddRefitClient<IApiService>()
.ConfigureHttpClient(c => c.BaseAddress = new Uri(baseUri))
.ConfigurePrimaryHttpMessageHandler(() => new BrowserMessageHandler());
当然,您仍然必须进行自己的序列化/反序列化,但是我使用这些扩展名,以便在必要时也可以访问HttpResponseMessage。
public static async Task<T> As<T>(this Task<HttpResponseMessage> task)
{
var response = await task.ConfigureAwait(false);
return await response.As<T>();
}
public static async Task<T> As<T>(this HttpResponseMessage message)
{
var json = await message.Content.ReadAsStringAsync();
return Json.Deserialize<T>(json);
}
我希望这会使某人的生活比我在完成所有工作之前要容易一些!