我有一个 .NET 8 Maui Blazor 混合应用程序,我目前正在尝试弄清楚如何从 BlazorWebView 访问 cookie。
到目前为止,我已经检查了 WebView 文档,其中包含我需要的“Cookies”属性。但是,尽管有这个名字,BlazorWebView 奇怪的是并不是源自
WebView
。
我发现访问至少有关于 cookie 的成员的 webview 的一种方法是通过特定于平台的代码,滥用
BlazorWebView
背后的实际实现。对于 Windows,这看起来像这样:
MainPage.xaml.cs
public MainPage()
{
InitializeComponent();
}
protected override void OnHandlerChanged()
{
var webView = blazorWebView.Handler?.PlatformView as Microsoft.UI.Xaml.Controls.WebView2;
}
但是,如果我尝试从
CookieManager
中获取 WebView2
,我会遇到 nullref
//CoreWebView2 is null here
var cm = webView.CoreWebView2.CookieManager;
另一个问题是,结果将是一个
CoreWebview2CookieManager
,管理一个 CoreWebView2Cookie
列表,而不是漂亮且简单的 System.Net Cookie。这意味着不仅要获取 cookie,而且还必须为每个平台实现每个接触 cookie 的类。
我知道我可以使用
IPreferences
或 ISecureStorage
代替 cookie,并通过 AuthenticationStateProvider
进行身份验证,但我不敢相信从像那里那样的 BlazorWebView
不会轻松访问 cookie来自常规的WebView
。真的没有吗
但是,如果我随后尝试从该 WebView2 获取 CookieManager,我会遇到 nullref
这是因为执行Page的OnHandlerChanged方法时,BlazorWebview尚未初始化。
您可以尝试在 BlazorWebview 的
BlazorWebViewInitialized
方法中获取 CookieManager:
在xaml中:
<BlazorWebView x:Name="blazorWebView" HostPage="wwwroot/index.html" BlazorWebViewInitialized="blazorWebView_BlazorWebViewInitialized">
在后面的代码中:
private void blazorWebView_BlazorWebViewInitialized(object sender, Microsoft.AspNetCore.Components.WebView.BlazorWebViewInitializedEventArgs e)
{
var webview = blazorWebView.Handler.PlatformView as Microsoft.UI.Xaml.Controls.WebView2;
var webView2 = webview.CoreWebView2;
var cookie = webView2.CookieManager;
}