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);
}));
我在 .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);
}));