.NET混合开发解决方案16 管理WebView2的用户数据


系列目录    

WebView2控件应用详解系列博客

 

  在我的博客中介绍了将WebView2控件集成到WinForm程序中编译后的文件及结构信息

当运行WinForm程序并使用WebView2控件加载网页后

应用程序目录中又多了一个目录“XXXX.WebView2”,其中XXXX是应用程序的名称

这个目录就是WebView2控件运行后产生的针对本项目的用户数据文件夹

用户数据文件夹 UDF

  用户数据文件夹(User Data Folder)是存储在用户计算机上的文件夹,其中包含与主机应用和 WebView2 相关的数据。

几个术语

  • 用户数据文件夹 WebView2 创建的用于存储浏览器数据的文件夹,例如 Cookie、权限和缓存资源。
  • UDF 位置 用户数据文件夹的目录路径。
  • 默认 UDF 位置 用户数据文件夹的默认目录路径。 如果未指定自定义 UDF 位置,则 WebView2 将在其中创建 UDF 的目录路径。
  • 自定义 UDF 位置 用户数据文件夹的自定义位置。 WebView2 主机应用指定 WebView2 将创建用户数据文件夹的位置的目录路径。

默认情况下,WebView2 在特定平台的默认位置创建 UDF。 这适用于某些平台,但不适用于其他平台。 如果应用有特定需求,可以指定自定义 UDF 位置。 确保指定的自定义 UDF 位置对 WebView2 应用运行时具有适当的读/写权限。

自定义 UDF 位置

通过如下逻辑代码指定自定义UDF位置。此代码必须在初始化CoreWebView2属性之前执行。CoreWebView2一旦被初始化就不允许更改UserDataFolder的位置。

确保指定的自定义 UDF 位置对 WebView2 应用运行时具有适当的读/写权限。

如果用户数据文件夹 (UDF) 没有写入权限,则可能会返回以下错误消息字符串:

  • User data folder cannot be created because a file with the same name already exists.
  • Unable to create user data folder, Access Denied.

无论用户数据文件夹的位置是默认 UDF 位置还是自定义 UDF 位置,上述内容均为 true。

如果内存不足,或者Microsoft Edge运行时无法启动,或者找不到 WebView2 运行时,可能会返回类似于以下内容的错误消息字符串:

  • Microsoft Edge runtime unable to start
  • Failed to create WebView2 environment

添加代码(如代码) try/catch 以处理这些错误。 这些错误往往是无法从中恢复的致命错误,因此 try/catch 会防止应用崩溃。 然后,你将能够检测到故障并正常关闭应用。 某些错误是无法恢复的,例如 Access Denied ,尝试使用没有写入权限的用户数据文件夹时。错误消息字符串显示在对话框中。

运行程序后,在D:\WebView2Demo_WinForm_UDF位置产生了用户数据文件夹及数据信息

为什么要自定义UDF位置

不指定UDF位置时,默认在应用程序的根目录下自动创建该目录。如果应用程序需要卸载然后重新安装,那么之前的UDF中的数据无法被重用。

自定义UDF位置后,应用程序可以随意安装、转移、卸载,UDF中的数据一直可以被使用。

UDF 中存储的数据类型

WebView2 应用使用用户数据文件夹 (UDF) 来存储浏览器数据,例如 Cookie、权限和缓存的资源。通过 CoreWebView2BrowsingDataKinds 枚举可以检索每一个数据项

如何以及何时创建 UDF

WebView2控件为 WebView2 主机应用创建用户数据文件夹 (UDF) 。UDF 是在平台的默认 UDF 位置中创建的,或者如果主机应用指定了自定义 UDF 位置,则会在自定义 UDF 位置中创建 UDF。如果 UDF 不存在,则会在启动 WebView2 主机应用时创建 UDF。

创建了多少 UDF

WebView2 控件的每个实例都与用户数据文件夹 (UDF) 相关联。

每个 WebView2 会话必须具有 UDF。 每个 WebView2 会话只有 1 个活动 UDF。
每个应用 WebView2 会话至少有一个 UDF。 主机应用可以通过指定自定义 UDF 位置来重叠它们。 或者,每台计算机可以有一个 UDF。 这取决于主机应用如何配置 UDF。
如果每个用户安装了应用,则 UDF 可以是每个用户。 如果主机应用是按用户安装的,则每个 UDF 对于用户是唯一的(如果未指定)。

如何移动 UDF

若要将用户数据文件夹移 (UDF) :

(1)关闭所有 WebView2 会话。
(2)启动新的 WebView2 主机应用会话,指定新的自定义 UDF 位置。

从用户数据文件夹中清除浏览数据

若要清除 WebView2 应用的用户数据文件夹中的浏览数据并释放空间,而不是 (UDF) 删除用户数据文件夹,请调用 Clear Browsing Data API 的方法。

使用 Clear Browsing Data API,可以以编程方式清除与 WebView2 用户配置文件关联的 用户数据文件夹 中的数据。 例如,使用此 API 在用户注销时清除用户数据和历史记录。可以如下操作:

CoreWebView2Profile webViewProfile = webView2.CoreWebView2.Profile; 

CoreWebView2Profile 类目前仅在 WebView2.NET Prerelease 预发布版本中提供,版本:1.0.1018, 1.0.1056, 1.0.1083, 1.0.1133, 1.0.1158, 1.0.1189, 1.0.1222。 其他正式版中暂时不提供。

  • 清除所有浏览数据
await webViewProfile.ClearBrowsingDataAsync();
  • 清除所选类型的浏览数据

  无论何时创建数据,此方法都会清除指定类型的浏览数据。 它从调用该方法的用户配置文件的用户数据文件夹中清除数据。

await webViewProfile.ClearBrowsingDataAsync(CoreWebView2BrowsingDataKinds.AllProfile);

其中 CoreWebView2BrowsingDataKinds 枚举提供了各种类型的数据,参考具体的枚举定义

/// 
  /// Indicates the kind of browsing data to clear. Or operations can be applied to create a mask representing multiple CoreWebView2BrowsingDataKinds. The resulting mask may be passed to  to clear the corresponding data.
  /// 
  [Flags]
  public enum CoreWebView2BrowsingDataKinds
  {
    /// Specifies file systems data.
    FileSystems = 1,
    /// Specifies data stored by the IndexedDB DOM feature.
    IndexedDb = 2,
    /// Specifies data stored by the localStorage DOM API.
    LocalStorage = 4,
    /// 
    /// Specifies data stored by the Web SQL database DOM API.
    /// 
    WebSql = 8,
    /// Specifies data stored by the CacheStorage DOM API.
    CacheStorage = 16, // 0x00000010
    /// 
    /// Specifies DOM storage data, now and future. This browsing data kind is inclusive of CoreWebView2BrowsingDataKinds.FileSystems, CoreWebView2BrowsingDataKinds.IndexedDb, CoreWebView2BrowsingDataKinds.WebSql, CoreWebView2BrowsingDataKinds.CacheStorage. New DOM storage data types may be added to this data kind in the future.
    /// 
    AllDomStorage = 32, // 0x00000020
    /// Specifies HTTP cookies data.
    Cookies = 64, // 0x00000040
    /// 
    /// Specifies all site data, now and future. This browsing data kind is inclusive of CoreWebView2BrowsingDataKinds.AllDomStorage and CoreWebView2BrowsingDataKinds.Cookies. New site data types may be added to this data kind in the future.
    /// 
    AllSite = 128, // 0x00000080
    /// Specifies disk cache.
    DiskCache = 256, // 0x00000100
    /// Specifies download history data.
    DownloadHistory = 512, // 0x00000200
    /// 
    /// Specifies general autofill form data. This excludes password information and includes information like: names, street and email addresses, phone numbers, and arbitrary input. This also includes payment data.
    /// 
    GeneralAutofill = 1024, // 0x00000400
    /// Specifies password autosave data.
    PasswordAutosave = 2048, // 0x00000800
    /// Specifies browsing history data.
    BrowsingHistory = 4096, // 0x00001000
    /// Specifies settings data.
    Settings = 8192, // 0x00002000
    /// 
    /// Specifies profile data that should be wiped to make it look like a new profile. This does not delete account-scoped data like passwords but will remove access to account-scoped data by signing the user out. Specifies all profile data, now and future. New profile data types may be added to this data kind in the future. This browsing data kind is inclusive of , , , , , , .
    /// 
    AllProfile = 16384, // 0x00004000
  }
  • 清除指定时间范围内的选定类型的浏览数据
 DateTime startTime = DateTime.Now.AddHours(-1);
 DateTime endTime = DateTime.Now;
 CoreWebView2BrowsingDataKinds dataKinds = CoreWebView2BrowsingDataKinds.GeneralAutofill 
| CoreWebView2BrowsingDataKinds.PasswordAutosave; await webViewProfile.ClearBrowsingDataAsync(dataKinds, startTime, endTime);//清除时间范围内选定类型的浏览数据
其他重要问题

一、是否在各种方案中保留用户数据文件夹

  • 主机应用程序控制用户数据文件夹(UDF)的生存期。如果应用程序重新使用应用程序会话中的用户数据,请考虑保存(即不删除)UDF。
  • 如果你的应用程序没有重用应用程序会话中的用户数据,你可以删除UDF。但是,在会话运行时,最好调用clear browsing data方法,而不是删除UDF。

二、如果同一用户重复使用你的应用,并且应用的 Web 内容依赖于用户的数据,则保留用户数据文件夹

在此方案中,请勿显式删除用户数据文件夹 (UDF) ,保留数据。

三、如果多个用户重复使用你的应用,则保留用户数据文件夹

  如果多个用户重复使用应用,则应为每个新用户创建新的用户数据文件夹 (UDF) ,并保存每个用户的 UDF。

  WebView2 控件为每个新用户创建一个新的 UDF。 WebView2 控件为每个会话创建一个 UDF。 如果有多个 WebView2 会话,WebView2 控件将创建多个 UDF。 通常,如果主机应用具有多个 WebView2 控件实例,则主机应用应将 WebView2 的所有实例指向同一 UDF。

  每个具有 WebView2 控件实例的主机应用都将有自己的 UDF。 主机应用可以将每个 UDF 点指向同一位置。

  如果主机应用适用于多个用户,则可能应为每个用户创建一个 UDF。 如果你的应用是按用户安装的,则这就是它的工作原理。

  如果启动两个主机应用副本,它们将使用相同的 UDF

    • 对于 Win32 主机应用,不会自动删除 UDF。
    • 对于 .NET (WPF & WinForms) 主机应用,不会自动删除 UDF。
    • 对于ClickOnce主机应用,将自动删除 UDF。
    • 对于 WinUI 2 (UWP) 主机应用,不会自动删除 UDF。
    • 对于 WinUI 3 主机应用,不会自动删除 UDF。

四、卸载主机应用

卸载 WebView2 主机应用程序建议使用标准卸载过程。此过程对 WebView2 并不唯一。

  • 卸载期间,安装程序可能需要清理任何创建的 UDF。 在某些情况下,你可能想要保留 UDF。
  • 如果创建主机应用、创建 MSIX 安装程序、安装主机应用,然后运行主机应用,则会创建 UDF。 但是,如果卸载主机应用,则不会自动清理 UDF (,因为卸载程序会保护并保留用户数据) ,因此卸载过程需要注意这一注意事项。
  • 在ClickOnce应用中,它将安装在单个位置,会话结束时,它会删除整个树,以便自动删除 UDF。 这是因为ClickOnce的工作原理,而不是因为 WebView2 的工作原理。

五、如果应用没有重复用户,请保留用户数据文件夹

在此方案中,为每个用户创建新的用户数据文件夹 (UDF) ,并删除以前的 UDF。

六、删除用户数据文件夹

主机应用或卸载程序可以删除用户数据文件夹 (UDF) 。 出于以下任何原因,可能需要删除 UDF:

  • 如果要卸载打包Windows应用商店应用。 在这种情况下,Windows自动删除 UDF。

  • 如果要清理所有浏览数据历史记录。 但是,请首先调用 clear browsing data 方法。

  • 如果要从数据损坏中恢复。

  • 如果要删除以前的会话数据。

  • 如果要更改 UDF 位置。 如果更改 UDF 位置,则不会自动清理以前的 UDF。

七、在删除 UDF 之前结束 WebView2 会话

若要删除 UDF) (用户数据文件夹,必须先结束 WebView2 会话。 如果 WebView2 会话当前处于活动状态,则无法删除 UDF。

八、在删除 UDF 之前等待浏览器进程退出

  如果在 WebView2 主机应用关闭后文件仍在使用中,请等待浏览器进程退出,然后再删除用户数据文件夹 (UDF) 。
  关闭 WebView2 应用后,UDF 中的文件可能仍在使用中。 在这种情况下,请等待浏览器进程和所有子进程退出,然后再删除 UDF。 若要监视等待其退出的进程,请使用 WebView2 的 BrowserProcessId 属性检索浏览器进程的进程ID。

九、共享用户数据文件夹

WebView2控件实例可以共享相同的用户数据文件夹(UDF),以执行以下操作:

  • 通过在一个浏览器进程中运行来优化系统资源。 请参阅 。

  • 共享浏览器历史记录和缓存的资源。

共享 UDF 时,请考虑以下事项:

  • 重新创建 WebView2 控件以使用 add_NewBrowserVersionAvailable ( Win32) 事件处理程序或 NewBrowserVersionAvailable (.NET) 事件更新浏览器版本时,主机应用必须确保浏览器进程退出并关闭共享同一 UDF 的任何 WebView2 控件。 若要检索浏览器进程的进程 ID,请使用 BrowserProcessId WebView2 控件的属性。

十、避免一次运行过多的文件夹

  若要隔离应用的不同部分,或者当不需要在 WebView2 控件之间共享数据时,可以使用不同的用户数据文件夹 (UDF) 。 例如,应用可以包含两个 WebView2 控件,一个用于显示广告,另一个用于显示应用内容。 可以为每个 WebView2 控件使用不同的 UDF。

  每个 WebView2 浏览器进程都会占用额外的内存和磁盘空间。 因此,请避免同时运行具有过多不同 UDF 的 WebView2 控件。

系列目录