.NET混合開發解決方案16 管理WebView2的使用者資料

張傳寧發表於2022-05-14

WebView2控制元件應用詳解系列部落格

.NET桌面程式整合Web網頁開發的十種解決方案

.NET混合開發解決方案1 WebView2簡介

.NET混合開發解決方案2 WebView2與Edge瀏覽器的區別

.NET混合開發解決方案3 WebView2的程式模型

.NET混合開發解決方案4 WebView2的執行緒模型

.NET混合開發解決方案5 WebView2執行時與分發應用

.NET混合開發解決方案7 WinForm程式中通過NuGet管理器引用整合WebView2控制元件

.NET混合開發解決方案8 WinForm程式中通過設定固定版本執行時的BrowserExecutableFolder屬性整合WebView2控制元件

.NET混合開發解決方案9 WebView2控制元件的導航事件

.NET混合開發解決方案10 WebView2控制元件呼叫網頁JS方法

.NET混合開發解決方案11 網頁JS呼叫C#方法

.NET混合開發解決方案12 網頁JS呼叫C#方法訪問WinForm或WPF窗體

.NET混合開發解決方案13 自定義WebView2中的上下文選單

.NET混合開發解決方案14 WebView2的基本身份驗證

.NET混合開發解決方案15 WebView2控制元件整合到WinForm程式編譯後的檔案及結構說明

  在我的部落格《.NET混合開發解決方案15 WebView2控制元件整合到WinForm程式編譯後的檔案及結構說明》中介紹了將WebView2控制元件整合到WinForm程式中編譯後的檔案及結構資訊

當執行WinForm程式並使用WebView2控制元件載入網頁後

.NET混合開發解決方案16 管理WebView2的使用者資料

應用程式目錄中又多了一個目錄“XXXX.WebView2”,其中XXXX是應用程式的名稱

.NET混合開發解決方案16 管理WebView2的使用者資料

這個目錄就是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的位置。

.NET混合開發解決方案16 管理WebView2的使用者資料

確保指定的自定義 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位置產生了使用者資料資料夾及資料資訊

.NET混合開發解決方案16 管理WebView2的使用者資料

為什麼要自定義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 列舉提供了各種型別的資料,參考具體的列舉定義

.NET混合開發解決方案16 管理WebView2的使用者資料
/// <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 控制元件。

相關文章