.NET混合開發解決方案16 管理WebView2的用戶數據
- 2022 年 5 月 14 日
- 筆記
- .NET:WebView2, WebView2
WebView2控制項應用詳解系列部落格
.NET混合開發解決方案2 WebView2與Edge瀏覽器的區別
.NET混合開發解決方案5 WebView2運行時與分發應用
.NET混合開發解決方案7 WinForm程式中通過NuGet管理器引用集成WebView2控制項
.NET混合開發解決方案8 WinForm程式中通過設置固定版本運行時的BrowserExecutableFolder屬性集成WebView2控制項
.NET混合開發解決方案9 WebView2控制項的導航事件
.NET混合開發解決方案10 WebView2控制項調用網頁JS方法
.NET混合開發解決方案12 網頁JS調用C#方法訪問WinForm或WPF窗體
.NET混合開發解決方案13 自定義WebView2中的上下文菜單
在我的部落格《.NET混合開發解決方案15 WebView2控制項集成到WinForm程式編譯後的文件及結構說明》中介紹了將WebView2控制項集成到WinForm程式中編譯後的文件及結構資訊
當運行WinForm程式並使用WebView2控制項載入網頁後
應用程式目錄中又多了一個目錄「XXXX.WebView2」,其中XXXX是應用程式的名稱
這個目錄就是WebView2控制項運行後產生的針對本項目的用戶數據文件夾。
用戶數據文件夾(User Data Folder)是存儲在用戶電腦上的文件夾,其中包含與主機應用和 WebView2 相關的數據。
幾個術語
- 用戶數據文件夾 WebView2 創建的用於存儲瀏覽器數據的文件夾,例如 Cookie、許可權和快取資源。
- UDF 位置 用戶數據文件夾的目錄路徑。
- 默認 UDF 位置 用戶數據文件夾的默認目錄路徑。 如果未指定自定義 UDF 位置,則 WebView2 將在其中創建 UDF 的目錄路徑。
- 自定義 UDF 位置 用戶數據文件夾的自定義位置。 WebView2 主機應用指定 WebView2 將創建用戶數據文件夾的位置的目錄路徑。
默認情況下,WebView2 在特定平台的默認位置創建 UDF。 這適用於某些平台,但不適用於其他平台。 如果應用有特定需求,可以指定自定義 UDF 位置。 確保指定的自定義 UDF 位置對 WebView2 應用運行時具有適當的讀/寫許可權。
通過如下邏輯程式碼指定自定義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中的數據一直可以被使用。
WebView2 應用使用用戶數據文件夾 (UDF) 來存儲瀏覽器數據,例如 Cookie、許可權和快取的資源。通過 CoreWebView2BrowsingDataKinds 枚舉可以檢索每一個數據項
WebView2控制項為 WebView2 主機應用創建用戶數據文件夾 (UDF) 。UDF 是在平台的默認 UDF 位置中創建的,或者如果主機應用指定了自定義 UDF 位置,則會在自定義 UDF 位置中創建 UDF。如果 UDF 不存在,則會在啟動 WebView2 主機應用時創建 UDF。
WebView2 控制項的每個實例都與用戶數據文件夾 (UDF) 相關聯。
每個 WebView2 會話必須具有 UDF。 每個 WebView2 會話只有 1 個活動 UDF。
每個應用 WebView2 會話至少有一個 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 枚舉提供了各種類型的數據,參考具體的枚舉定義


/// <summary> /// 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 <see cref="M:Microsoft.Web.WebView2.Core.CoreWebView2Profile.ClearBrowsingDataAsync(Microsoft.Web.WebView2.Core.CoreWebView2BrowsingDataKinds,System.DateTime,System.DateTime)" /> to clear the corresponding data. /// </summary> [Flags] public enum CoreWebView2BrowsingDataKinds { /// <summary>Specifies file systems data.</summary> FileSystems = 1, /// <summary>Specifies data stored by the IndexedDB DOM feature.</summary> IndexedDb = 2, /// <summary>Specifies data stored by the localStorage DOM API.</summary> LocalStorage = 4, /// <summary> /// Specifies data stored by the Web SQL database DOM API. /// </summary> WebSql = 8, /// <summary>Specifies data stored by the CacheStorage DOM API.</summary> CacheStorage = 16, // 0x00000010 /// <summary> /// 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. /// </summary> AllDomStorage = 32, // 0x00000020 /// <summary>Specifies HTTP cookies data.</summary> Cookies = 64, // 0x00000040 /// <summary> /// 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. /// </summary> AllSite = 128, // 0x00000080 /// <summary>Specifies disk cache.</summary> DiskCache = 256, // 0x00000100 /// <summary>Specifies download history data.</summary> DownloadHistory = 512, // 0x00000200 /// <summary> /// 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. /// </summary> GeneralAutofill = 1024, // 0x00000400 /// <summary>Specifies password autosave data.</summary> PasswordAutosave = 2048, // 0x00000800 /// <summary>Specifies browsing history data.</summary> BrowsingHistory = 4096, // 0x00001000 /// <summary>Specifies settings data.</summary> Settings = 8192, // 0x00002000 /// <summary> /// 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 <see cref="F:Microsoft.Web.WebView2.Core.CoreWebView2BrowsingDataKinds.AllSite" />, <see cref="F:Microsoft.Web.WebView2.Core.CoreWebView2BrowsingDataKinds.DiskCache" />, <see cref="F:Microsoft.Web.WebView2.Core.CoreWebView2BrowsingDataKinds.DownloadHistory" />, <see cref="F:Microsoft.Web.WebView2.Core.CoreWebView2BrowsingDataKinds.GeneralAutofill" />, <see cref="F:Microsoft.Web.WebView2.Core.CoreWebView2BrowsingDataKinds.PasswordAutosave" />, <see cref="F:Microsoft.Web.WebView2.Core.CoreWebView2BrowsingDataKinds.BrowsingHistory" />, <see cref="F:Microsoft.Web.WebView2.Core.CoreWebView2BrowsingDataKinds.Settings" />. /// </summary> AllProfile = 16384, // 0x00004000 }
View Code
- 清除指定時間範圍內的選定類型的瀏覽數據
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),以執行以下操作:
-
通過在一個瀏覽器進程中運行來優化系統資源。 請參閱 WebView2 應用的進程模型。
-
共享瀏覽器歷史記錄和快取的資源。
共享 UDF 時,請考慮以下事項:
- 重新創建 WebView2 控制項以使用 add_NewBrowserVersionAvailable ( Win32) 事件處理程式或 NewBrowserVersionAvailable (.NET) 事件更新瀏覽器版本時,主機應用必須確保瀏覽器進程退出並關閉共享同一 UDF 的任何 WebView2 控制項。 若要檢索瀏覽器進程的進程 ID,請使用
BrowserProcessId
WebView2 控制項的屬性。
十、避免一次運行過多的文件夾
若要隔離應用的不同部分,或者當不需要在 WebView2 控制項之間共享數據時,可以使用不同的用戶數據文件夾 (UDF) 。 例如,應用可以包含兩個 WebView2 控制項,一個用於顯示廣告,另一個用於顯示應用內容。 可以為每個 WebView2 控制項使用不同的 UDF。
每個 WebView2 瀏覽器進程都會佔用額外的記憶體和磁碟空間。 因此,請避免同時運行具有過多不同 UDF 的 WebView2 控制項。