在 WebResourceRequested 事件中为 WebView2 设置 cookie
Set cookies for WebView2, in WebResourceRequested event
我正在使用新的 WebView2 控件(开发者预览版)替换 Windows.Forms 应用程序中的 WebBrowser 控件。
切换到 WebView2 控件的主要原因是它基于与 WebRTC 一起工作的 Chromium,而 WebBrowser 控件由不支持 WebRTC 的 Internet Explorer 提供支持。
所以我遇到的问题是找到一种方法来为我希望 WebView2 导航到的 url 设置 cookie。以前使用WebBrowser时,可以在webBrowser.Navigate之前调用InternetSetCookie来设置cookie,但InternetSetCookie只适用于Internet Explorer
需要在第三方网站上设置 cookie 以进行身份验证,即向网站证明我的应用程序已经登录(由我的应用程序的其他未使用 WebView2 的部分早些时候完成)。该应用程序在登录响应中成功捕获了 auth cookie,但我无法找到如何在使用 WebView2 控件导航时将 cookie 传回网站。 WebView2 控件用于导航到同一网站上的另一个页面,其中使用了 WebRTC。
https://github.com/MicrosoftEdge/WebViewFeedback/issues/4 解释说目前还没有提供在 WebView2 中设置 cookie 的快速机制,但建议处理 WebResourceRequested 事件,然后通过修改 WebResourceRequested 事件处理程序内部的 request.Header 来设置 cookie .
那么谁能解释一下如何真正让 WebResourceRequested 事件为 WebView2 触发?我试过这个失败了:
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 来触发它,但是其中的 none 导致触发 WebResourceRequested 事件。
我从 WebView_CoreWebView2Ready 事件中挂接 WebResourceRequested 的事件处理程序的原因是,如果您尝试更早地挂接它(例如在表单加载中),那么 CoreWebView2 将为空,因为它需要更多时间。我已成功连接 WebView_CoreWebView2Ready 内的其他事件,它们确实触发了(例如 NavigationStarting 事件)。
谢谢。
WebResource Requested 事件仅在资源的活动过滤器存在且该过滤器匹配时触发。您可以使用
添加一个拦截所有请求的过滤器
WebView2.CoreWebView2.AddWebResourceRequestedFilter("*", CoreWebView2WebResourceContext.All);
要缩小和更新您感兴趣的实际请求的过滤器,您可以检查 args.Request.RequestUri
CoreWebView2OnWebResourceRequested 事件内部。
通过创建本地服务器并通过 WebView 连接到它,您可以看到在将 .NET HttpRequest 转换为 WebView 本身使用的 COM WebRequest 时,WebView 预览不会复制 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();
}
}
}
}
您可能应该为 Edge WebView 预览提交错误报告。
我发现我无法在 WebResourceRequested 事件处理程序中设置 cookie 的原因是因为这是一个已知错误,已在此处报告给 Microsoft:
Unable to set headers in WebResourceRequested event handler
所以总而言之,我的代码确实显示了添加 cookie 的正确方法,但是在 Microsoft 修复错误之前它不会起作用。
我很欣赏这个答案没有提供解决方法,但它至少回答了为什么代码当前无法添加 cookie 的问题。
我正在使用新的 WebView2 控件(开发者预览版)替换 Windows.Forms 应用程序中的 WebBrowser 控件。
切换到 WebView2 控件的主要原因是它基于与 WebRTC 一起工作的 Chromium,而 WebBrowser 控件由不支持 WebRTC 的 Internet Explorer 提供支持。
所以我遇到的问题是找到一种方法来为我希望 WebView2 导航到的 url 设置 cookie。以前使用WebBrowser时,可以在webBrowser.Navigate之前调用InternetSetCookie来设置cookie,但InternetSetCookie只适用于Internet Explorer
需要在第三方网站上设置 cookie 以进行身份验证,即向网站证明我的应用程序已经登录(由我的应用程序的其他未使用 WebView2 的部分早些时候完成)。该应用程序在登录响应中成功捕获了 auth cookie,但我无法找到如何在使用 WebView2 控件导航时将 cookie 传回网站。 WebView2 控件用于导航到同一网站上的另一个页面,其中使用了 WebRTC。
https://github.com/MicrosoftEdge/WebViewFeedback/issues/4 解释说目前还没有提供在 WebView2 中设置 cookie 的快速机制,但建议处理 WebResourceRequested 事件,然后通过修改 WebResourceRequested 事件处理程序内部的 request.Header 来设置 cookie .
那么谁能解释一下如何真正让 WebResourceRequested 事件为 WebView2 触发?我试过这个失败了:
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 来触发它,但是其中的 none 导致触发 WebResourceRequested 事件。
我从 WebView_CoreWebView2Ready 事件中挂接 WebResourceRequested 的事件处理程序的原因是,如果您尝试更早地挂接它(例如在表单加载中),那么 CoreWebView2 将为空,因为它需要更多时间。我已成功连接 WebView_CoreWebView2Ready 内的其他事件,它们确实触发了(例如 NavigationStarting 事件)。
谢谢。
WebResource Requested 事件仅在资源的活动过滤器存在且该过滤器匹配时触发。您可以使用
添加一个拦截所有请求的过滤器WebView2.CoreWebView2.AddWebResourceRequestedFilter("*", CoreWebView2WebResourceContext.All);
要缩小和更新您感兴趣的实际请求的过滤器,您可以检查 args.Request.RequestUri
CoreWebView2OnWebResourceRequested 事件内部。
通过创建本地服务器并通过 WebView 连接到它,您可以看到在将 .NET HttpRequest 转换为 WebView 本身使用的 COM WebRequest 时,WebView 预览不会复制 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();
}
}
}
}
您可能应该为 Edge WebView 预览提交错误报告。
我发现我无法在 WebResourceRequested 事件处理程序中设置 cookie 的原因是因为这是一个已知错误,已在此处报告给 Microsoft:
Unable to set headers in WebResourceRequested event handler
所以总而言之,我的代码确实显示了添加 cookie 的正确方法,但是在 Microsoft 修复错误之前它不会起作用。
我很欣赏这个答案没有提供解决方法,但它至少回答了为什么代码当前无法添加 cookie 的问题。