MAUI普通WebView在Windows调用EvaluateJavaScriptAsync遇CoreWebView2缺失求助
MAUI WebView在Windows平台调用EvaluateJavaScriptAsync抛出InvalidOperationException的解决办法
问题重现
在MAUI项目中,通过以下代码调用WebView执行JS获取SessionId:
private async void GetSessionIdFromWebView() { sessionId = await webViewer.EvaluateJavaScriptAsync("MauiAppInterface.GetSessionId();"); }
对应的XAML使用普通WebView:
<WebView x:Name="webViewer" />
执行时WebView实例和Source均不为空,但仅Windows平台抛出异常:
System.InvalidOperationException: "A method was called at an unexpected time. ExecuteScriptAsync(): Failed because a valid CoreWebView2 is not present. Make sure one was created, for example by calling EnsureCoreWebView2Async() API."
原因分析
MAUI的WebView在Windows平台底层基于CoreWebView2(Edge Chromium内核)实现,但CoreWebView2的初始化是异步延迟进行的。如果在它完成初始化前调用EvaluateJavaScriptAsync,就会触发该异常。而Android/iOS平台的WebView实现逻辑不同,不存在这个初始化时机的限制。
解决方案
方法1:主动确保CoreWebView2初始化完成
针对Windows平台单独处理,先调用EnsureCoreWebView2Async完成初始化,再执行JS代码:
private async void GetSessionIdFromWebView() { #if WINDOWS var webView2 = webViewer.Handler.PlatformView as Microsoft.UI.Xaml.Controls.WebView2; if (webView2 != null && webView2.CoreWebView2 == null) { await webView2.EnsureCoreWebView2Async(); } #endif sessionId = await webViewer.EvaluateJavaScriptAsync("MauiAppInterface.GetSessionId();"); }
方法2:等待页面导航完成后执行JS
页面导航完成时,CoreWebView2通常已初始化完毕,可通过Navigated事件触发JS调用:
在XAML中添加事件绑定:
<WebView x:Name="webViewer" Navigated="WebViewer_Navigated" />
后台代码:
private bool _isSessionIdFetched = false; private async void WebViewer_Navigated(object sender, WebNavigatedEventArgs e) { // 避免重复执行 if (_isSessionIdFetched) return; sessionId = await webViewer.EvaluateJavaScriptAsync("MauiAppInterface.GetSessionId();"); _isSessionIdFetched = true; }
注意事项
- 不要在WebView构造函数或页面
OnAppearing方法中直接调用EvaluateJavaScriptAsync,此时Windows端CoreWebView2大概率未完成初始化。 - 即使加载本地HTML,也需等待CoreWebView2初始化完成,不能仅依赖Source是否设置。
内容的提问来源于stack exchange,提问作者Dominik
相关产品推荐
相关产品推荐

