WebView2浏览器.WebMessageReceived未触发两次



我正在使用WebView2在网页和Visual Basic应用程序之间进行通信。

在我的JavaScript中,我调用了

app.visualBasic = {};
app.visualBasic.createPromise = () => {
return new Promise((resolve, reject) => {
app.visualBasic.promise = { resolve: resolve, reject: reject };
});
};
app.visualBasic.promise = null;
app.visualBasic.resolve = (literal) => {
literal = literal || '{}';
const json = JSON.parse(literal);
app.visualBasic.promise.resolve(json);
};
app.visualBasic.reject = (literal) => {
literal = literal || '{}';
const json = JSON.parse(literal);
app.visualBasic.promise.reject(json);
};
const populateCategories = async () => {
const message = {
Endpoint: '/api/category/get-all'
};
chrome.webview.postMessage(message);
const promise = app.visualBasic.createPromise();
try {
const result = await promise;
if (result?.HttpStatusCode < 200 || result?.HttpStatusCode > 299) {
throw result?.Body;
}
app.data = JSON.parse(result.Body);
} catch (ex) {
ex = ex || {};
app.notification.create('danger', ex.Error || 'Something went wrong getting the categories', ex);
return;
} finally {
app.visualBasic.promise = null;
}
// do something with app.data
};

在我的VB.NET应用程序中,我正在处理WebView2Browser。WebMessageReceived事件,并根据某些业务逻辑使用(截断代码(发送回app.visualBasic.reject()app.visualBasic.resolve(...)

Private Sub WebView2Browser_WebMessageReceived(sender As Object, e As CoreWebView2WebMessageReceivedEventArgs) Handles WebView2Browser.WebMessageReceived
Dim webViewSender = DirectCast(sender, WebView2)
Dim json As String = e.WebMessageAsJson()
Dim request As WebMessageRequest
Dim response = New WebMessageResponse()
Try
Try
request = JsonConvert.DeserializeObject(Of WebMessageRequest)(json)
Catch ex As Exception
Throw New Exception("Invalid WebMessageRequest", ex)
End Try
' ...
Catch ex As Exception
Dim largeLog = New With {request, ex.Message}
My.Application.Logger.Log(JsonConvert.SerializeObject(largeLog), ex.InnerException)
webViewSender.ExecuteScriptAsync("app.visualBasic.reject();").Wait()
Return
End Try
WebViewSender.ExecuteScriptAsync($"app.visualBasic.resolve(`{JsonConvert.SerializeObject(response)}`);").Wait()
End Sub

问题是,运行此代码一次效果很好,但运行一次后,我的WebView2Browser中的任何断点设置都会出现问题。未触发WebMessageReceived事件处理程序。

这是我使用JavaScript promise的方式有问题吗?还是WebView2控件有错误?

;主机和网络内容之间的通信";";开始使用WinForms应用程序中的WebView2";文章(此处(,建议返回WebView的方法是调用CoreWebView2.PostWebMessageAsString或CoreWebView 2.PostWebMessage AsJson方法,并让JavaScript的window.chrome.WebView侦听消息事件。

这并不理想,因为我不能使用async/await模式来使代码更加线性,但它仍然有效。

这里有一个例子:

window.chrome.webview.addEventListener('message', e => {
e = e || {};
e.data = e.data || {};
if (e.data.Error) {
app.notification.create('danger', e.data.Error);
return;
}
// do something
}, false);

WebView2Browser.CoreWebView2.PostWebMessageAsJson(JsonConvert.SerializeObject(...))

最新更新