如何在 WebView2 中获取服务器响应代码

问题描述

我正在尝试使用 WebView2 并获取服务器响应代码。但是 CoreWebView2WebResourceRequestedEventArgs.Response 由于某种原因始终为空:

    webView.CoreWebView2Ready += CoreWebView2Ready;        

    private void CoreWebView2Ready(object sender,EventArgs e)
    {
        webView.CoreWebView2.AddWebResourceRequestedFilter("*",CoreWebView2WebResourceContext.All);
        webView.CoreWebView2.WebResourceRequested += WebResourceRequested;
    }

    private void WebResourceRequested(object sender,CoreWebView2WebResourceRequestedEventArgs e)
    {
        /* e.Response is always null for some reason */
        if (e.Response != null)
        {
            int statusCode = e.Response.StatusCode;
            string header = e.Response.Headers.GetHeader("myheader");
        }
    }

如何获取响应代码

解决方法

我认为 e.Response 将始终为 null,因为 WebResourceRequested 事件是在发送请求之前触发的。您应该在事件处理程序中创建响应。那不是你想要的。

那你怎么办?好吧,WebView2 的新预发布版本可能有您想要的 - WebResourceResponseReceived 活动。当您收到来自服务器的响应并且此处 e.Response 可用时触发。

使用:

  1. 安装/更新 Microsoft.WebView2 预发布版本(最新)。
  2. 安装 Microsoft Edge 的 Canary 版本。
  3. 卸载WebView2 Runtime - 否则仍会使用。

现在您可以使用如下代码(注意新的事件名称):

using Microsoft.Web.WebView2.Core;
using System.Windows.Forms;

namespace WindowsFormsApp2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void WebView21_CoreWebView2InitializationCompleted(object sender,CoreWebView2InitializationCompletedEventArgs e)
        {
            webView21.CoreWebView2.WebResourceResponseReceived += CoreWebView2_WebResourceResponseReceived;
        }

        private void CoreWebView2_WebResourceResponseReceived(object sender,CoreWebView2WebResourceResponseReceivedEventArgs e)
        {
            if (e.Response != null && e.Response.Headers.Contains("date"))
            {
                int statusCode = e.Response.StatusCode;
                string header = e.Response.Headers.GetHeader("date");
                MessageBox.Show(header);
            }
        }
    }
}

请注意,如果标头不存在,e.Response.Headers.GetHeader 将引发异常,因此请先检查它。