You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF中WebView2存储Cookie等数据及CoreWebView2空引用异常问题

WPF WebView2 操作Cookie/存储时的空引用异常解决

问题场景

需要在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 14:01:00