C# 在WebResourceRequested事件中为WebView2设置cookies

C# 在WebResourceRequested事件中为WebView2设置cookies,c#,winforms,cookies,webview2,C#,Winforms,Cookies,Webview2,我正在使用新的WebView2控件(在开发者预览中)替换Windows.Forms应用程序中的WebBrowser控件 切换到WebView2控件的主要原因是它基于Chromium,Chromium与WebRTC一起工作,而WebBrowser控件由不支持WebRTC的Internet Explorer提供电源 因此,我遇到的问题是找到一种方法为我希望WebView2导航到的url设置cookie。在过去,当使用WebBrowser时,可以通过在WebBrowser.Navigate之前调用In

我正在使用新的WebView2控件(在开发者预览中)替换Windows.Forms应用程序中的WebBrowser控件

切换到WebView2控件的主要原因是它基于Chromium,Chromium与WebRTC一起工作,而WebBrowser控件由不支持WebRTC的Internet Explorer提供电源

因此,我遇到的问题是找到一种方法为我希望WebView2导航到的url设置cookie。在过去,当使用WebBrowser时,可以通过在WebBrowser.Navigate之前调用InternetSetCookie来设置Cookie,但InternetSetCookie仅适用于Internet Explorer

cookie需要设置为在第三方网站上进行身份验证,即向网站证明我的应用程序已经登录(由我的应用程序中不使用WebView2的其他部分提前完成)。该应用程序在登录响应中成功捕获了auth cookie,但在使用WebView2控件导航时,我找不到如何将cookie传递回网站。WebView2控件用于导航到同一网站上使用WebRTC的另一页

说明WebView2中尚未提供设置cookie的快速机制,但建议处理WebResourceRequested事件,然后通过修改WebResourceRequested事件处理程序中的request.Header来设置cookie

那么,有人能解释一下如何为WebView2实际触发WebResourceRequested事件吗?我尝试过这个方法,但没有成功:

        private string myUrl = "https://www.somedomain.com";

        private void WebView_CoreWebView2Ready(object sender, EventArgs e)
        {
            webView.CoreWebView2.AddWebResourceRequestedFilter(myUrl,CoreWebView2WebResourceContext.All);
            webView.CoreWebView2.WebResourceRequested += CoreWebView2_WebResourceRequested;
        }

        private void CoreWebView2_WebResourceRequested(object sender, CoreWebView2WebResourceRequestedEventArgs e)
        {
            Uri myUri = new Uri(myUrl);

            if (myUri.IsBaseOf(e.Request.RequestUri))
            {
                e.Request.Headers.Add("Cookie", cookieName, authToken);
            }
        }
WebResourceRequested事件从不激发。我尝试通过调用WebView2.Navigate、WebView2.CoreWebView2.Navigate和WebView2.Source来启动它,但它们都不会导致WebResourceRequested事件启动

我从WebView_CoreWebView2Ready事件中连接WebResourceRequested的事件处理程序的原因是,如果您尝试更早地连接它(例如在表单加载中),那么CoreWebView2将为null,因为它需要更多的时间。我已经成功地连接了WebView_CoreWebView2中的其他事件,它们确实触发了(例如NavigationStarting事件)


谢谢。

只有当资源的活动筛选器存在且该筛选器匹配时,才会触发WebResource Requested事件。您可以添加一个过滤器,通过使用

WebView2.CoreWebView2.AddWebResourceRequestedFilter("*", CoreWebView2WebResourceContext.All);
要缩小并更新您感兴趣的实际请求的筛选器,可以检查CoreWebView2OnWebResourceRequested事件内部的
args.Request.RequestUri

通过创建本地服务器并通过WebView连接到它,您可以看到WebView预览在将.NET HttpRequest转换为WebView本身使用的COM WebRequest时不会复制cookie

using (HttpListener listener = new HttpListener())
{
    listener.Prefixes.Add($"http://localhost:8080/");
    listener.Start();

    while (listener.IsListening)
    {
        var context = await listener.GetContextAsync();

        using (var response = context.Response)
        {
            for (int i = 0; i < context.Request.Headers.Count; i++)
            {
                Console.WriteLine($"{context.Request.Headers.GetKey(i)} : {context.Request.Headers.Get(i)}");
            }
            
            using (var writer = new StreamWriter(response.OutputStream))
            {
                context.Response.ContentType = "text";
                writer.WriteLine("Test.");
                writer.Flush();
            }
        }
    }
}
使用(HttpListener=newhttplistener())
{
listener.Prefixes.Add($)http://localhost:8080/");
listener.Start();
while(listener.IsListening)
{
var context=await listener.GetContextAsync();
使用(var response=context.response)
{
for(int i=0;i

您可能应该为Edge WebView预览提交错误报告。

我发现无法在WebResourceRequested事件处理程序中设置Cookie的原因是,这是一个已知的错误,已在此处报告给Microsoft:

总之,我的代码确实显示了添加cookie的正确方法,但在微软修复错误之前,它不会起作用


我很感激这个答案没有提供一个解决方法,但它至少回答了一个问题,即为什么代码当前无法添加cookie。

因此,仍然需要理解为什么忽略这一行:e.Request.Headers.add(“cookie”、cookieName、authToken);我编辑了这个问题来展示如何检查args.Request.RequestUri,谢谢@ZiggZagg。