我可以在 blazor 中使用 Autorest 客户端吗
Posted
技术标签:
【中文标题】我可以在 blazor 中使用 Autorest 客户端吗【英文标题】:Can I use an Autorest client in blazor 【发布时间】:2018-10-01 15:17:37 【问题描述】:当我尝试在 webassembly 上运行我的 blazor 应用程序时,我从 mono 平台收到了 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 ---
...
【问题讨论】:
【参考方案1】:是的,这是可能的。但是您必须使用由 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;
又好又简单!
【讨论】:
我相信这可能与我在***.com/questions/68225808/… 的问题中遇到的问题相同,但我不明白您提供的解决方案。您能帮忙解答我的问题吗?【参考方案2】:Blazor/webassembly 应用在浏览器沙箱中运行,因此受限于浏览器网络的可能性。这意味着所有的网络流量都需要经过浏览器网络请求系统。
它似乎尝试使用不受支持的代理。
【讨论】:
所以你认为这是一个安全的东西?这听起来更像是平台的限制。堆栈跟踪的这一部分有点搞笑:GetDefaultProxy_UsingOldMonoCode
是webassembly的限制。并且完全可以理解 imo。如果 webassembly 能够超越 js,那将造成重大的潜在安全漏洞。
另外,请参阅此处如何在 blazor 中执行网络请求:learn-blazor.com/architecture/rest-api【参考方案3】:
现在使用 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);
我希望这能让某人的生活比我在完成所有这些工作之前的生活更轻松!
【讨论】:
以上是关于我可以在 blazor 中使用 Autorest 客户端吗的主要内容,如果未能解决你的问题,请参考以下文章
注意:从配置中选择的 AutoRest 核心版本:~2.0.4413 当我安装了 3.06187
Autorest 生成需要 beta 包的 Client Sdk