gpt4 book ai didi

c# - 在 WebResourceRequested 事件中为 WebView2 设置 cookie

转载 作者:行者123 更新时间:2023-12-05 03:52:03 31 4
gpt4 key购买 nike

我正在使用新的 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 事件处理程序内部的请求.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 来触发它,但它们都不会导致触发 WebResourceRequested 事件。

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

谢谢。

最佳答案

WebResource Requested 事件仅在资源的事件过滤器存在且该过滤器匹配时才会触发。您可以添加一个过滤器来拦截所有请求,方法是使用

WebView2.CoreWebView2.AddWebResourceRequestedFilter("*", CoreWebView2WebResourceContext.All);

要缩小和更新您感兴趣的实际请求的过滤器,您可以检查 CoreWebView2OnWebResourceRequested 事件中的 args.Request.RequestUri

通过创建本地服务器并通过 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 预览提交错误报告。

关于c# - 在 WebResourceRequested 事件中为 WebView2 设置 cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62416494/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com