Fetch.continueRequest 的 WebView2 CallDevToolsProtocolMethodAsync 问题

WebView2 CallDevToolsProtocolMethodAsync issue with Fetch.continueRequest

我在 .net 5 WPF 应用程序中使用 WebView2,并且一直在使用 devtools 协议来拦截特定的资产请求。在查看 Chrome 开发文档 (https://chromedevtools.github.io/devtools-protocol/) 时,可以拦截请求,然后决定是继续它们、取消它们还是自己满足它们。

我已经能够成功拦截第一个 Web 请求(例如 https:// www.somedomain.tld),但我无法成功继续该请求(这可能会触发任何其他请求由于解析的 html 响应而提出的资产请求)。

WebView 初始化后,我执行以下操作(有效):

// Intercept requests
var receiver = webView.CoreWebView2.GetDevToolsProtocolEventReceiver("Fetch.requestPaused");
receiver.DevToolsProtocolEventReceived += FetchRequestPaused;
await webView.CoreWebView2.CallDevToolsProtocolMethodAsync("Fetch.enable", "{}");

这是我的事件处理程序 - 它没有按照我的预期执行(尽管它至少现在没有死锁):

private void FetchRequestPaused(object sender, Microsoft.Web.WebView2.Core.CoreWebView2DevToolsProtocolEventReceivedEventArgs e)
{
   var doc = JsonDocument.Parse(e.ParameterObjectAsJson);
   var id = doc.RootElement.GetProperty("requestId");
   var payload = $"{{\"requestId\":\"{id}.0\"}}";

   // We can't do this as an async call as it will try to post to the main thread, which is
   // busy waiting in this event handler, so we deadlock
   //_ = await webView.CoreWebView2.CallDevToolsProtocolMethodAsync("Fetch.continueRequest", payload);

   // Exception: Value does not fall within the expected range.
   // var result = await webView.CoreWebView2.CallDevToolsProtocolMethodAsync("Fetch.continueRequest", payload).ConfigureAwait(false);

   // PROBLEM: This invokes the call on the UI thread OK...
   Application.Current.Dispatcher.Invoke(new Action(() =>
   {
      // ...but it doesn't actually do anything
      webView.CoreWebView2.CallDevToolsProtocolMethodAsync("Fetch.continueRequest", payload);
   }));
}

请求的页面不仅没有完成加载,而且浏览器处于异常状态,因此右键单击控件并选择“刷新”将崩溃 - 产生 COMException:

System.Runtime.InteropServices.COMException: 'The group or resource is not in the correct state to perform the requested operation. (0x8007139F)'

谁能看出我在这里做错了什么或遗漏了什么??

谢谢!

附加信息

在将事件换成已弃用的 Network.setRequestInterception / Network.continueInterceptedRequest 等价物时,我看到了相同的行为 - 这至少告诉我们这要么是我的调用代码有问题(大多数可能)或 WebView2 中的错误(可能)而不是 Chromium。

有什么想法吗?

经过更多的挖掘,我意识到有两个问题。首先是我安装的 Edge 版本略有落后。第二个是我的 Action 委托是同步的。通话内容应为:

// Somebody forgot some 'async' keywords..!
Application.Current.Dispatcher.Invoke(new Action(async () =>
{
   var x = await webView.CoreWebView2.CallDevToolsProtocolMethodAsync("Fetch.continueRequest", payload);
}));