我正在使用 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 承諾的方式有問題還是 WebView2 控制元件的錯誤?
uj5u.com熱心網友回復:
遵循“WinForms 應用程式中的 WebView2 入門”文章(此處)的“主機與 Web 內容之間的通信”部分后,建議的與 WebView 通信的方法是呼叫 CoreWebView2.PostWebMessageAsString 或 CoreWebView2.PostWebMessageAsJson 方法和讓 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(...))
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/529163.html
上一篇:搜索按鈕,在中繼器中搜索
