问题描述
我正在尝试使用 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
可用时触发。
使用:
- 安装/更新
Microsoft.WebView2
预发布版本(最新)。 - 安装 Microsoft Edge 的 Canary 版本。
- 卸载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
将引发异常,因此请先检查它。