C# 在WebResourceRequested事件中为WebView2设置cookies
我正在使用新的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事件吗?我尝试过这个方法,但没有成功: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
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。