我已经创建了一个具有本机消息传递的Microsoft边缘扩展,但我无法使其与非持久连接一起使用。
这里给出的示例在我的特定情况下没有用:
该示例(随机数生成器(演示当服务器已在运行时,两个 UWP 应用程序如何在客户端与服务器通信的位置进行通信。在具有本机消息传递的边缘扩展中(我的基于数字签名和安全输入示例(,我有一个 W32 应用程序,当消息通过扩展从页面到达时,服务器未运行。
我已经检查了我能在这里找到的所有示例,但没有一个使用我需要的"非持久"连接:
我也尝试在我的 Edge 扩展中使用runtime.sendNativeMessage
,但这仅适用于第一条消息。
我没有交互式html页面,用户可以在其中启动与runtime.connectNative
的连接。这就是为什么它必须是"非持久"连接,使用runtime.sendNativeMessage
以类似于Chrome和Firefox使用的方式从本机应用程序start/query/get-response
。
Edge 中没有用于持久性和非持久性连接的单独 API。唯一的区别是:对于持久性连接,我们将在成功建立连接后保持打开状态。我们可以关闭它,直到任务完成。请参考此示例。
但是,对于非持久性连接,我们会在收到响应并将其存储为 AppServiceResponse 后立即释放连接。此示例非常清楚,我们可以看到 AppServiceConnection 对象仅持续一个连接。
希望这有帮助。
我现在已经解决了这个问题,并将我的 Edge 扩展从持久连接扩展转换为非持久连接扩展。
假设您从类似于此处的扩展开始,将扩展转换为非持久性扩展的中心思想如下:
- 从内容和背景中删除与连接/断开连接相关的所有 JavaScript 代码.js.js
- 将启动 win32 应用程序的调用从 OnBackgroundActivated (( 移动到 OnAppServiceRequestReceived((
- 最后一步确保我们只调用
Windows.ApplicationModel.FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync()
,当我们实际收到来自 Edge 的消息时。
- 然后使用 Edge 的消息有效负载调用 win32 应用程序。win32 应用程序在以下调用中通过应用服务连接将结果传达回边缘:
// Send message to the win32 application component and wait for response
AppServiceResponse centennialResponse = await this.centennialConnection.SendMessageAsync(args.Request.Message);
await args.Request.SendResponseAsync(centennialResponse.Message);
- 上述步骤会导致在后台以browser.runtime.sendNativeMessage((开头的调用.js该调用由OnAppServiceRequestReceived((拾取。后者启动 win32 应用程序,并通过 centennialConnection 中创建的 AppServiceConnection 将消息传递给它。它等待结果并将响应发送回后台.js。
- 最后一步中的调用都是在没有在后台脚本和后台任务之间建立会话或持久连接的情况下发生的。
由于上述更改,我们扩展的可靠性大大提高。