InvokeScriptAsync调用报错HRESULT:0x80020101,Chrome/IE中脚本可正常运行
解决InvokeScriptAsync调用报错HRESULT: 0x80020101的问题
我帮你梳理下这个问题的排查方向——这个错误码确实指向脚本执行异常,但既然你的JS在Chrome和IE里能正常跑,问题大概率出在WebView控件的执行环境和普通浏览器的差异上,尤其是在facebook.com这种有严格安全策略的站点,更容易触发这类问题。下面是几个常见的原因和对应的解决办法:
1. 页面未完全加载就执行脚本
Facebook的页面有大量异步加载的资源和DOM元素,如果你在页面还没加载完成时调用InvokeScriptAsync,脚本可能找不到依赖的对象,直接抛出语法/执行异常。
解决办法:
- 监听WebView的
NavigationCompleted事件,确认页面加载成功后再执行脚本:
webView.NavigationCompleted += async (sender, e) => { if (e.IsSuccess) { // 这里执行你的脚本 await webView.InvokeScriptAsync("eval", new[] { "你的JavaScript代码" }); } };
- 或者在脚本内部加上DOM就绪判断:
if (document.readyState === 'complete') { // 你的逻辑 } else { window.addEventListener('load', function() { // 你的逻辑 }); }
2. WebView的安全策略与Facebook的CSP冲突
Facebook的内容安全策略(CSP)会严格限制脚本的来源和执行方式,WebView默认的安全设置可能会触发这些限制,导致脚本无法正常执行。
解决办法:
- 检查WebView的安全配置:比如WebView2可以通过
CoreWebView2Settings开启脚本权限,确保IsScriptEnabled设为true; - 如果你的脚本是注入式执行,尝试将脚本包装成符合CSP要求的形式,避免被拦截。
3. 脚本上下文或API兼容性问题
WebView的JS运行环境和普通浏览器可能存在差异,比如某些全局对象、API在WebView中不可用,或者变量作用域不同,导致脚本执行失败。
解决办法:
- 给脚本加上兼容性检查,确保依赖的对象存在再执行:
(function() { // 先检查依赖对象是否存在 if (typeof window.someRequiredObject !== 'undefined') { // 你的业务逻辑 } })();
- 尽量使用标准JS API,避免依赖浏览器特有的扩展功能。
4. 脚本字符串的转义/编码错误
传递给InvokeScriptAsync的JS字符串如果包含特殊字符(比如单引号、双引号、换行),没有正确转义的话会直接导致语法错误。
解决办法:
- 用序列化工具处理脚本字符串,确保转义正确:
using Newtonsoft.Json; string rawJs = "console.log('Hello, Facebook!')"; // 自动处理转义 string escapedJs = JsonConvert.SerializeObject(rawJs); await webView.InvokeScriptAsync("eval", new[] { escapedJs });
5. WebView控件版本问题
如果使用的是WebView2这类基于Chromium的控件,旧版本的运行时可能存在兼容性bug,导致在某些站点执行脚本失败。
解决办法:
- 检查并更新WebView2 Runtime到最新版本;
- 在代码中指定兼容的WebView2版本,避免自动使用旧版。
另外,你提到之前也遇到过同款错误,可以回顾下之前的解决场景,大概率是同一类环境或时机问题导致的,比如之前也是在有严格安全策略的站点执行脚本,或者加载时机没把控好。
内容的提问来源于stack exchange,提问作者MusicAndCode
相关产品推荐
相关产品推荐

