首页 > 解决方案 > 具有本机消息传递和非持久连接的 Microsoft Edge 扩展不起作用

问题描述

我创建了一个带有本机消息传递的 Microsoft Edge 扩展,但我无法使其与非持久连接一起工作。

此处给出的示例在我的特定情况下没有用:

该示例(随机数生成器)显示了两个 UWP 应用程序如何在服务器已运行时在客户端与服务器进行通信的位置进行通信。在带有本机消息传递的边缘扩展中(我的基于数字签名和安全输入示例),我有一个 W32 应用程序,当消息通过扩展从页面到达时,服务器没有运行。

我已经检查了我可以在这里找到的所有示例,并且没有使用我需要的“非持久”连接:

我也尝试runtime.sendNativeMessage在我的 Edge 扩展中使用,但这仅适用于第一条消息。

我没有交互式 html 页面,用户可以通过该页面与runtime.connectNative. 这就是为什么它必须是一个“非持久”连接,以类似于 Chrome 和 Firefox 使用的runtime.sendNativeMessage方式start/query/get-response从本机应用程序使用。

标签: c++cnativemessagingmicrosoft-edge-extension

解决方案


我现在已经解决了这个问题,并将我的 Edge 扩展从持久连接扩展转换为非持久连接扩展。

假设您从类似于此处的扩展开始,将扩展转换为非持久扩展的中心思想如下:

  1. 从 content.js 和 background.js 中删除所有与连接/断开关联的 JavaScript 代码
  2. 将启动 win32 应用程序的调用从 OnBackgroundActivated() 移至 OnAppServiceRequestReceived()
  3. 最后一步确保我们只调用
Windows.ApplicationModel.FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync()

,当我们实际收到来自 Edge 的消息时。

  1. 然后使用来自 Edge 的消息的有效负载调用 win32 应用程序。win32 应用程序通过 AppServiceConnection 在以下调用中将结果传回给 Edge:
        // 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);
  1. 上述步骤导致调用以 background.js 中的 browser.runtime.sendNativeMessage() 开头,由 OnAppServiceRequestReceived() 拾取。后者启动 win32 应用程序并通过 centennialConnection 中的 AppServiceConnection 将消息传递给它。它等待结果并将响应发送回 background.js。
  2. 最后一步的调用都是在后台脚本和后台任务之间没有建立会话或持久连接的情况下发生的。

由于上述变化,我们扩展的可靠性有了很大的提高。


推荐阅读