Blazor WASM调用第三方API遇PlatformNotSupportedException问题求助
问题场景
我们在开发Blazor WASM项目,流程是用户填完表单后创建实体存入数据库,接着生成PDF并提交到外部消息平台,调用的是第三方提供的client.SendMsgAsync()方法,代码如下:
foreach (var user in userIdentifiers) { var response = await client.sendMsgAsync( accesscode: paswoord, userIdentifier: user, title: "Lovapaanvraag", body: "Zie .pdf bijlage voor uitgebreide informatie", senderIdentifier: senderIdentifier, attachments: jsonString, coaccount: 0, copyToLVS: false); int resultaat = Convert.ToInt32(response); if (resultaat != 0) geslaagd = false; }
这个第三方API调用成功时会返回值为0的object类型结果。在其他项目中做单元测试一切正常,但在Blazor WASM中运行时抛出错误:
System.PlatformNotSupportedException: Cannot wait on monitors on this runtime.
已确认这是线程阻塞问题,试过Task.WhenAll()、Task.Delay()都无效,知道需要抽离异步工作但不清楚具体实现方式。
更新:有评论指出问题根源是该第三方服务内部持有锁,而Blazor WASM运行时不支持这类锁操作,需要寻找替代方案。
解决方案
Blazor WASM运行在浏览器单线程环境中,不支持传统的线程监视器、锁等待操作,而第三方API内部使用了这类不兼容代码,最可靠的解决方式是将第三方API的调用逻辑迁移到后端服务:
- 搭建一个ASP.NET Core后端接口,在接口内部调用
client.SendMsgAsync()方法 - Blazor WASM前端通过HTTP请求调用该后端接口,由后端完成与外部消息平台的交互
- 后端运行在支持多线程和锁操作的环境中,不会出现平台不支持的错误
如果一定要在前端尝试,也可以用Task.Run包装API调用,但Blazor WASM的线程池限制较多,成功率不高,还是后端代理方案更稳定。
内容的提问来源于stack exchange,提问作者Ioannes Arkhipov
相关产品推荐
相关产品推荐

