WPF中WebView2存储Cookie等数据及CoreWebView2空引用异常问题
问题场景
需要在WPF的WebView2中实现Cookie、会话存储(Session Storage)或本地存储(Local Storage)的读写操作,尝试通过CoreWebView2CookieManager设置Cookie,在页面初始化阶段执行以下代码:
string uri = @"http://localhost:8080"; var cookie = WebView .CoreWebView2 .CookieManager .CreateCookie("Token", "XJKDKD", ".com", null); cookie.IsHttpOnly = true; cookie.IsSecure = true; WebView.CoreWebView2.CookieManager.AddOrUpdateCookie(cookie); WebView.CoreWebView2.Navigate(uri);
报错信息
触发System.NullReferenceException异常,具体提示:
System.NullReferenceException: 'Object reference not set to an instance of an object.' Microsoft.Web.WebView2.Wpf.WebView2.CoreWebView2.get
原因分析
WebView2控件的CoreWebView2对象并非在页面初始化时就立即就绪,它需要完成加载初始化(包括环境初始化)才能被正常访问。直接在页面初始化代码中访问CoreWebView2会因对象未实例化导致空引用异常。
解决方案
必须等待CoreWebView2初始化完成后再执行相关操作,常用两种实现方式:
方式一:异步等待CoreWebView2初始化
在页面的初始化方法中(如窗口的Loaded事件),先调用EnsureCoreWebView2Async确保CoreWebView2完成初始化:
private async void Window_Loaded(object sender, RoutedEventArgs e) { // 确保CoreWebView2完成初始化 await WebView.EnsureCoreWebView2Async(); string uri = @"http://localhost:8080"; var cookie = WebView.CoreWebView2.CookieManager.CreateCookie("Token", "XJKDKD", ".com", null); cookie.IsHttpOnly = true; cookie.IsSecure = true; WebView.CoreWebView2.CookieManager.AddOrUpdateCookie(cookie); WebView.CoreWebView2.Navigate(uri); }
方式二:监听CoreWebView2Ready事件
通过订阅WebView2的CoreWebView2Ready事件,在事件回调中执行Cookie操作:
public MainWindow() { InitializeComponent(); // 订阅CoreWebView2就绪事件 WebView.CoreWebView2Ready += WebView_CoreWebView2Ready; } private void WebView_CoreWebView2Ready(object sender, EventArgs e) { string uri = @"http://localhost:8080"; var cookie = WebView.CoreWebView2.CookieManager.CreateCookie("Token", "XJKDKD", ".com", null); cookie.IsHttpOnly = true; cookie.IsSecure = true; WebView.CoreWebView2.CookieManager.AddOrUpdateCookie(cookie); WebView.CoreWebView2.Navigate(uri); }
扩展:Cookie、会话/本地存储的读写操作
读取Cookie
通过CookieManager.GetCookiesAsync获取指定域名下的Cookie:
// 获取localhost相关的所有Cookie var cookies = await WebView.CoreWebView2.CookieManager.GetCookiesAsync(@"http://localhost:8080"); foreach (var cookie in cookies) { if (cookie.Name == "Token") { string tokenValue = cookie.Value; // 处理Cookie值 } }
操作会话存储(Session Storage)
通过ExecuteScriptAsync执行JS代码读写Session Storage:
// 写入Session Storage await WebView.CoreWebView2.ExecuteScriptAsync("sessionStorage.setItem('userName', 'Ashok')"); // 读取Session Storage string userNameJson = await WebView.CoreWebView2.ExecuteScriptAsync("sessionStorage.getItem('userName')"); // 解析JSON字符串得到实际值 string userName = System.Text.Json.JsonSerializer.Deserialize<string>(userNameJson);
操作本地存储(Local Storage)
类似Session Storage,通过JS代码实现读写:
// 写入Local Storage await WebView.CoreWebView2.ExecuteScriptAsync("localStorage.setItem('theme', 'dark')"); // 读取Local Storage string themeJson = await WebView.CoreWebView2.ExecuteScriptAsync("localStorage.getItem('theme')"); string theme = System.Text.Json.JsonSerializer.Deserialize<string>(themeJson);
内容的提问来源于stack exchange,提问作者Ashok Sen
相关产品推荐
相关产品推荐

