C# winform 窗体 利用webview2绑定百度图,怎样判断在网页上是否发送请求,

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}");
                }



            }

shouldInterceptRequest 看看



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 控件中的网页请求。然而,有几个要注意的地方:

  1. 确保事件订阅正确: 你需要确保在 InitializeAsync 方法中正确订阅 CoreWebView2_WebResourceRequested 事件。

  2. 事件处理逻辑: 你的事件处理代码看起来正确,但你可能需要检查是否存在其他因素阻止了事件触发。如果 WebView2 控件尝试通过 HTTPS 加载资源,你需要确保已经处理了 EnsureHttps 方法中的 HTTPS 重定向。

  3. 跨域请求: 有时,网页可能会在前端进行跨域请求,这可能导致 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);
        }
    }


}

}

C# Winform 中使用 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 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中判断网页是否发送请求,可以通过以下步骤:

  1. 使用CoreWebView2.add_WebResourceRequested事件来侦听Web资源请求。

  2. 在事件处理程序中访问请求的URL,并根据需要将其与百度地图的URL进行比较。

  3. 如果请求的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;

C# winform窗体使用WebBrowser控件显示百度地图_webbrowser map.centerandzoom_你懂的11的博客-CSDN博客 个人微信公众号:“免费桌面小应用”。有新程序会微信推送通知。谢谢大家扫描关注。突然想试试winfrom窗体调用html页面并显示页面内容。就拿展示地图来试试。先上效果图:下面是项目创建的过程:一、打开vs---新建项目项目选择windows窗体项目。名字随便取。二、右键项目-->添加--->选择新建项。选择左边web下的html页三。现在项目下应该有一个窗体和一个html页了。代码部分..._webbrowser map.centerandzoom https://blog.csdn.net/u012408847/article/details/80000397?ops_request_misc=&request_id=&biz_id=102&utm_term=C&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-80000397.142^v93^insert_down1&spm=1018.2226.3001.4187#%20winform%20%E7%AA%97%E4%BD%93%20%E5%88%A9%E7%94%A8webview2%E7%BB%91%E5%AE%9A%E7%99%BE%E5%BA%A6%E5%9B%BE%EF%BC%8C&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-80000397.142^v93^insert_down1

更加网络请求返回状态来判断

引用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/");
}