C# winform 窗体 利用webview2绑定百度图,怎样判断在网页上是否发送请求,利用 CoreWebView2_WebResourceRequested 没起到效果
public Form6()
{
InitializeComponent();
webView21.NavigationStarting += EnsureHttps;
InitializeAsync();
webView21.CoreWebView2InitializationCompleted += WebView21_CoreWebView2InitializationCompleted;
// SetIEToEdgeMode();
}
private void CoreWebView2_WebResourceRequested(object sender, CoreWebView2WebResourceRequestedEventArgs e)
{
var request = e.Request;
var url = request.Uri.ToString();
var method = request.Method;
Debug.WriteLine($"收到请求:URL={url},方法={method}");
var headers = request.Headers;
foreach (var header in headers)
{
var value = header.Value;
Debug.WriteLine($"标头: {value}");
}
}
public Form6()
{
InitializeComponent();
webView21.CoreWebView2InitializationCompleted += WebView21_CoreWebView2InitializationCompleted;
}
private async void WebView21_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e)
{
if (e.IsSuccess)
{
webView21.NavigationStarting += EnsureHttps;
webView21.CoreWebView2.WebResourceRequested += CoreWebView2_WebResourceRequested;
// 现在您可以导航到特定的URL
await webView21.EnsureCoreWebView2Async();
webView21.CoreWebView2.Navigate("https://www.baidu.com");
}
}
private void CoreWebView2_WebResourceRequested(object sender, CoreWebView2WebResourceRequestedEventArgs e)
{
var request = e.Request;
var url = request.Uri.ToString();
var method = request.Method;
Debug.WriteLine($"收到请求:URL={url},方法={method}");
var headers = request.Headers;
foreach (var header in headers)
{
var value = header.Value;
Debug.WriteLine($"标头: {value}");
}
}
private void EnsureHttps(object sender, CoreWebView2NavigationStartingEventArgs e)
{
// 在导航之前执行必要的URL操作
if (!e.Uri.StartsWith("https://"))
{
e.Cancel = true;
webView21.CoreWebView2.Navigate("https://" + e.Uri);
}
}
【相关推荐】
根据你提供的代码,你似乎已经正确地使用了 CoreWebView2_WebResourceRequested
事件来监视 WebView2 控件中的网页请求。然而,有几个要注意的地方:
确保事件订阅正确: 你需要确保在 InitializeAsync
方法中正确订阅 CoreWebView2_WebResourceRequested
事件。
事件处理逻辑: 你的事件处理代码看起来正确,但你可能需要检查是否存在其他因素阻止了事件触发。如果 WebView2 控件尝试通过 HTTPS 加载资源,你需要确保已经处理了 EnsureHttps
方法中的 HTTPS 重定向。
跨域请求: 有时,网页可能会在前端进行跨域请求,这可能导致 CoreWebView2_WebResourceRequested
事件不触发。这可能需要在 WebView2 控件的初始化中启用跨域请求。
下面是一个稍微完整一些的示例:
using Microsoft.Web.WebView2.Core;
using System;
using System.Diagnostics;
using System.Windows.Forms;
namespace WebView2Example
{
public partial class Form6 : Form
{
public Form6()
{
InitializeComponent();
webView21.NavigationStarting += EnsureHttps;
InitializeAsync();
}
private async void InitializeAsync()
{
await webView21.EnsureCoreWebView2Async(null);
webView21.CoreWebView2.WebResourceRequested += CoreWebView2_WebResourceRequested;
}
private void CoreWebView2_WebResourceRequested(object sender, CoreWebView2WebResourceRequestedEventArgs e)
{
var request = e.Request;
var url = request.Uri.ToString();
var method = request.Method;
Debug.WriteLine($"收到请求:URL={url},方法={method}");
var headers = request.Headers;
foreach (var header in headers)
{
var value = header.Value;
Debug.WriteLine($"标头: {value}");
}
}
private void EnsureHttps(object sender, CoreWebView2NavigationStartingEventArgs e)
{
if (e.Uri.StartsWith("http://"))
{
e.Cancel = true;
webView21.CoreWebView2.Navigate(e.Uri.Replace("http://", "https://"));
}
}
}
}
请根据你的具体情况,检查上述几点,确保没有其他因素干扰了 CoreWebView2_WebResourceRequested
事件的触发。如果问题仍然存在,你可能需要仔细阅读 WebView2 控件的文档,以了解事件的触发条件和可能的限制。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Web.WebView2.WinForms;
using System.Security.Permissions;
using Microsoft.Win32;
using Microsoft.Web.WebView2.Core;
using System.Diagnostics;
using System.IO;
namespace test
{
public partial class Form6 : Form
{
private bool isWebResourceRequested = false;
public Form6()
{
InitializeComponent();
webView21.CoreWebView2InitializationCompleted += WebView21_CoreWebView2InitializationCompleted;
//webView21.NavigationStarting += EnsureHttps;
//InitializeAsync();
////webView21.CoreWebView2InitializationCompleted += WebView21_CoreWebView2InitializationCompleted;
//webView21.CoreWebView2InitializationCompleted += WebView21_CoreWebView2InitializationCompleted;
//webView21.CoreWebView2.WebResourceRequested += CoreWebView2_WebResourceRequested;
//webView21.CoreWebView2.WebResourceRequested += CoreWebView2_WebResourceRequested;
// SetIEToEdgeMode();
}
private void Form6_Load(object sender, EventArgs e)
{
this.MaximizedBounds = Screen.PrimaryScreen.WorkingArea;
this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
string url = "https://www.baidu.com/";
webView21.Source = new Uri(url);
//webView21.CoreWebView2.ExecuteScriptAsync(js);
}
private async void InitializeAsync()
{
await webView21.EnsureCoreWebView2Async(null);
}
private void CoreWebView2_WebResourceRequested(object sender, CoreWebView2WebResourceRequestedEventArgs e)
{
var request = e.Request;
var url = request.Uri.ToString();
var method = request.Method;
Debug.WriteLine( "123");
Debug.WriteLine($"收到请求:URL={url},方法={method}");
var headers = request.Headers;
foreach (var header in headers)
{
var value = header.Value;
Debug.WriteLine($"标头: {value}");
}
}
//void EnsureHttps(object sender, CoreWebView2NavigationStartingEventArgs args)
//{
// String uri = args.Uri;
// if (!uri.StartsWith("https://"))
// {
// webView21.CoreWebView2.ExecuteScriptAsync($"alert('{uri} is not safe, try an https link')");
// args.Cancel = true;
// }
//}
private async void WebView21_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e)
{
if (e.IsSuccess)
{
webView21.NavigationStarting += EnsureHttps;
webView21.CoreWebView2.WebResourceRequested += CoreWebView2_WebResourceRequested;
// 现在您可以导航到特定的URL
await webView21.EnsureCoreWebView2Async();
webView21.CoreWebView2.Navigate("https://www.baidu.com");
}
}
private void EnsureHttps(object sender, CoreWebView2NavigationStartingEventArgs e)
{
// 在导航之前执行必要的URL操作
if (!e.Uri.StartsWith("https://"))
{
e.Cancel = true;
webView21.CoreWebView2.Navigate("https://" + e.Uri);
}
}
//将IE版本设置为Edge模式:
private void SetIEToEdgeMode()
{
string productName = AppDomain.CurrentDomain.SetupInformation.ApplicationName;
RegistryKey key = Registry.CurrentUser;
RegistryKey software =
key.OpenSubKey(
@"Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", true);
if (software != null)
{
software.SetValue(productName, 11001, RegistryValueKind.DWord);
}
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
namespace WindowsFormsApplication7
{
public partial class Form1 : Form
{
bool isOk = false;
public Form1()
{
InitializeComponent();
}
public static bool IsWebServiceAvailable(string webServiceUrl)
{
try
{
WebRequest webRequest = WebRequest.Create(webServiceUrl);
HttpWebRequest httpRequest = webRequest as HttpWebRequest;
httpRequest.Timeout = 3000;
if (httpRequest == null)
return false;
try
{
HttpWebResponse resp = (HttpWebResponse)httpRequest.GetResponse();
return true;
}
catch (Exception ex)
{
MessageBox.Show(" " + ex.Message, "ERROR");
return false;
}
}
catch (Exception ex)
{
MessageBox.Show(" " + ex.Message, "ERROR");
return false;
}
}
private void button1_Click(object sender, EventArgs e)
{
isOk = IsWebServiceAvailable(textBox1.Text);
textBox2.Text = isOk.ToString();
}
}
}
在CoreWebView2_WebResourceRequested事件处理程序中获取请求的URL、方法和标头信息,以判断是否在网页上发送了请求
结合GPT给出回答如下请题主参考
要在WebView2中判断网页是否发送请求,可以通过以下步骤:
使用CoreWebView2.add_WebResourceRequested事件来侦听Web资源请求。
在事件处理程序中访问请求的URL,并根据需要将其与百度地图的URL进行比较。
如果请求的URL与百度地图URL匹配,则将请求标记为已处理,以便WebView2不会发送它。
以下是示例代码:
private void webView_CoreWebView2Ready(object sender, EventArgs e)
{
// 绑定Web资源请求事件
webView.CoreWebView2.WebResourceRequested += CoreWebView2_WebResourceRequested;
}
private void CoreWebView2_WebResourceRequested(object sender, CoreWebView2WebResourceRequestedEventArgs e)
{
// 获取请求的URL
var url = e.Request.Uri;
// 如果请求的URL包含百度地图,则将请求标记为已处理
if (url.Contains("baidu.com/maps/"))
{
e.Response = webView.CoreWebView2.Environment.CreateWebResourceResponse(null, 0, "OK", "Content-Type: text/plain", "");
}
}
请注意,CoreWebView2_WebResourceRequested事件在WebView2加载百度地图时多次调用。因此,需要确保正确标记要跳过的请求。
C# Winform 中使用 Webview2,可以参考资料:
https://www.yii666.com/blog/522409.html
检查已正确订阅CoreWebView2_WebResourceRequested事件,在代码中,要将事件处理程序与CoreWebView2.WebResourceRequested事件关联起来,类似于以下方式:
webView21.CoreWebView2.WebResourceRequested += CoreWebView2_WebResourceRequested;
更加网络请求返回状态来判断
引用chatgpt内容作答:
当您在C# WinForms应用程序中使用WebView2控件并尝试使用CoreWebView2_WebResourceRequested事件来检测请求时,可以采取以下步骤来解决问题:
1、事件订阅: 确保您已正确地订阅了CoreWebView2_WebResourceRequested事件。在您的代码片段中,您已经定义了事件处理程序方法(CoreWebView2_WebResourceRequested),但我没有看到您实际上是如何订阅事件的。您需要使用类似以下的代码将事件处理程序与事件关联起来:
webView21.CoreWebView2.WebResourceRequested += CoreWebView2_WebResourceRequested;
此订阅应在CoreWebView2初始化完成(WebView21_CoreWebView2InitializationCompleted事件)之后和任何导航之前进行。
2、初始化顺序: 确保在订阅CoreWebView2_WebResourceRequested事件之前调用了InitializeAsync方法。必须在附加事件处理程序之前完成CoreWebView2的初始化。
3、导航事件: 根据您在WebView2控件中加载的网站或内容的结构,NavigationStarting事件可能无法涵盖所有请求。您可能希望在WebView21_CoreWebView2InitializationCompleted事件中附加事件处理程序,以确保CoreWebView2完全初始化。
以下是带有这些考虑因素的代码示例:
public Form6()
{
InitializeComponent();
webView21.CoreWebView2InitializationCompleted += WebView21_CoreWebView2InitializationCompleted;
}
private async void WebView21_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e)
{
if (e.IsSuccess)
{
webView21.NavigationStarting += EnsureHttps;
webView21.CoreWebView2.WebResourceRequested += CoreWebView2_WebResourceRequested;
// 现在您可以导航到特定的URL
await webView21.EnsureCoreWebView2Async();
webView21.CoreWebView2.Navigate("https://www.baidu.com");
}
}
private void CoreWebView2_WebResourceRequested(object sender, CoreWebView2WebResourceRequestedEventArgs e)
{
var request = e.Request;
var url = request.Uri.ToString();
var method = request.Method;
Debug.WriteLine($"收到请求:URL={url},方法={method}");
var headers = request.Headers;
foreach (var header in headers)
{
var value = header.Value;
Debug.WriteLine($"标头: {value}");
}
}
private void EnsureHttps(object sender, CoreWebView2NavigationStartingEventArgs e)
{
// 在导航之前执行必要的URL操作
if (!e.Uri.StartsWith("https://"))
{
e.Cancel = true;
webView21.CoreWebView2.Navigate("https://" + e.Uri);
}
}
请根据需要添加错误处理和其他逻辑,以满足您的应用程序要求。
参考gpt:
结合自己分析给你如下建议:
您需要确保您的WebView2已经初始化完成,并且已经添加了WebResourceRequested事件的处理函数。您可以使用CoreWebView2InitializationCompleted事件来检查WebView2是否初始化完成,并在其中添加WebResourceRequested事件的订阅。
您需要设置WebResourceRequested事件的资源类型过滤器,以便只捕获您感兴趣的请求类型,例如图片、脚本、样式表等。您可以使用AddWebResourceRequestedFilter方法来添加过滤器,并指定资源类型。
您需要在WebResourceRequested事件的处理函数中获取请求的信息,例如URL、方法、标头等,并根据您的需求进行处理或修改。您可以使用CoreWebView2WebResourceRequestedEventArgs类来访问请求的属性和方法。
该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索并已验证可行,得到内容具体如下:
在C# WinForms中使用WebView2控件绑定百度图,并判断网页是否发送请求的方法是正确的,但你需要确保正确注册事件和设置相关属性。
1、首先,确保在初始化过程中注册CoreWebView2_WebResourceRequested
事件。在你的代码示例中,我没有看到注册该事件的部分。你可以通过以下方式注册事件:
webView21.CoreWebView2.WebResourceRequested += CoreWebView2_WebResourceRequested;
请确保在webView21.CoreWebView2InitializationCompleted
事件中进行注册,以确保WebView2已初始化完成。
2、其次,在事件处理程序CoreWebView2_WebResourceRequested
中,你可以获取请求的URL、方法和标头信息。你可以通过以下方式进行调试输出:
private void CoreWebView2_WebResourceRequested(object sender, CoreWebView2WebResourceRequestedEventArgs e)
{
var request = e.Request;
var url = request.Uri.ToString();
var method = request.Method;
Debug.WriteLine($"收到请求:URL={url},方法={method}");
var headers = request.Headers;
foreach (var header in headers)
{
var name = header.Key;
var value = header.Value;
Debug.WriteLine($"标头: {name} = {value}");
}
}
确保在调试输出中能够看到请求的URL和标头信息,这样你就可以判断网页是否发送了请求。
如果你的代码仍然无法捕获请求,有几个可能的原因:
1、 确保CoreWebView2
已经完成初始化。你可以在webView21.CoreWebView2InitializationCompleted
事件中注册CoreWebView2_WebResourceRequested
事件,以确保WebView2已初始化完成。
2、 确保你的WebView2版本与Web资源请求事件兼容。某些WebView2版本可能不支持CoreWebView2_WebResourceRequested
事件。尝试升级到最新版本的WebView2,以确保获得最佳兼容性。
希望这些信息能够帮助你解决问题。如果你仍然还有问题,请提供更多代码和详细的错误描述。
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢
根据您提供的代码,您已经使用了CoreWebView2_WebResourceRequested
事件来尝试捕获WebView2控件中发出的网络请求。然而,如果您发现这个事件没有生效,可能是因为在绑定事件之前,您的CoreWebView2
可能还没有完全初始化,导致事件无法正确触发。
确保在绑定事件之前,CoreWebView2
已经完成了初始化。您可以在CoreWebView2InitializationCompleted
事件中绑定CoreWebView2_WebResourceRequested
事件,以确保在初始化完成后进行事件绑定。以下是一个示例:
public Form6()
{
InitializeComponent();
webView21.NavigationStarting += EnsureHttps;
InitializeAsync();
webView21.CoreWebView2InitializationCompleted += WebView21_CoreWebView2InitializationCompleted;
}
private async void InitializeAsync()
{
await webView21.EnsureCoreWebView2Async(null);
}
private void WebView21_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e)
{
webView21.CoreWebView2.WebResourceRequested += CoreWebView2_WebResourceRequested;
}
private void CoreWebView2_WebResourceRequested(object sender, CoreWebView2WebResourceRequestedEventArgs e)
{
var request = e.Request;
var url = request.Uri.ToString();
var method = request.Method;
Debug.WriteLine($"收到请求:URL={url},方法={method}");
var headers = request.Headers;
foreach (var header in headers)
{
var value = header.Value;
Debug.WriteLine($"标头: {value}");
}
}
请注意,我在InitializeAsync
方法中使用了await webView21.EnsureCoreWebView2Async(null);
来确保CoreWebView2
已经初始化完成。然后,在WebView21_CoreWebView2InitializationCompleted
事件中,我绑定了CoreWebView2_WebResourceRequested
事件。这样,您可以在WebView2控件初始化完成后,捕获并处理网页上的请求。
如果仍然没有效果,您可能需要检查一下是否存在其他问题,例如WebView2的版本问题、网络连接问题等。确保在处理网络请求之前,WebView2已经初始化并加载了所需的页面。
推荐使用谷歌内核的方式来调用百度地图
试试
public Form6()
{
InitializeComponent();
webView21.NavigationStarting += EnsureHttps;
InitializeAsync();
webView21.CoreWebView2InitializationCompleted += WebView21_CoreWebView2InitializationCompleted;
}
private void WebView21_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e)
{
webView21.CoreWebView2.WebResourceRequested += CoreWebView2_WebResourceRequested;
webView21.CoreWebView2.Settings.IsWebMessageEnabled = true;
webView21.CoreWebView2.AddWebResourceRequestedFilter("*", CoreWebView2WebResourceContext.Image);
}
private void CoreWebView2_WebResourceRequested(object sender, CoreWebView2WebResourceRequestedEventArgs e)
{
var request = e.Request;
var url = request.Uri.ToString();
var method = request.Method;
Debug.WriteLine($"收到请求:URL={url},方法={method}");
var headers = request.Headers;
foreach (var header in headers)
{
var value = header.Value;
Debug.WriteLine($"标头: {value}");
}
}
async void InitializeAsync()
{
await webView21.EnsureCoreWebView2Async(null);
webView21.CoreWebView2.Navigate("https://image.baidu.com/");
}