Office.context.ui.displayDialogAsync 抛出 5001 内部错误

Office.context.ui.displayDialogAsync throws 5001 Internal Error

我正在使用 Visual Studio 项目模板创建一个新的 Outlook 邮件加载项,我在其中获得了显示当前所选电子邮件属性的示例。

我添加了一个带有点击事件处理程序的按钮,以使用以下代码打开对话框:

  $('#clickMeButton').click(function () {
      Office.context.ui.displayDialogAsync('https://localhost/OutlookAddinTest/MessageDialog.html', {
          height: 40,
          width: 40,
          requireHTTPS: true
      }, function (result) {
          _dlg = result.value;
          _dlg.addEventHandler(Microsoft.Office.WebExtension.EventType.DialogMessageReceived, dialogMessageReceived);
      });
  });

我正在 Chrome 中使用 Outlook Web 客户端对此进行调试:

我不知道它是否与此错误有关,但我可以在网站加载后、单击 clickMeButton 之前看到以下错误:

osfruntime.js:13 Error while parsing the 'sandbox' attribute: 'ms-allow-popups' is an invalid sandbox flag.OSF.OsfControl._createIframeAndActivateOsfControl @ osfruntime.js:13

displayDialogAsync(...) 函数不是应该用于 Outlook 邮件加载项吗?这可能是一个问题,因为它会在主 Outlook html 页面的上下文中加载另一个 html 页面。但它在 Outlook 桌面客户端中也不起作用。

  • 错误

错误osfruntime.js:13 Error while parsing the 'sandbox' attribute: ms-allow-popups

来自 ms-allow-popupsvendor prefixed css property 的事实。

事实上,您可能知道您的加载项位于沙盒 iframe 中。为了能够做一些事情,这个沙盒 iframe 有一些额外的权限。例如,弹出窗口是允许的,但由于 MS IE、Google Chrome、Firefox 等并未 100% 同意沙盒选项,它们有一些 'vendor' 特定选项和 ms-allow-popups是其中之一(对于 MS IE)。如果您使用开发者工具浏览 iFrame,您会发现以下选项 sandbox="allow-scripts allow-forms allow-same-origin ms-allow-popups allow-popups".

总结一下错误,您可以忽略它,因为它仅由 Chrome 引发,因为它不理解 Microsoft 供应商前缀。您的代码对此不承担任何责任。

  • 认证问题

现在介绍 dialogAPI。遗憾的是,dialogAPI 仅适用于 Microsoft Outlook Desktop 2016 最新版本。 (>= 16.0.6741.1000.)。确保您的 Outlook 桌面是最新的。 Web 客户端(又名 OWA)没有 dialogAPI。使用 OWA,您将无法在 Chrome 上看到任何对话框。

我在 Keluro 上实施的解决方案是在以下示例代码(打字稿)可用时使用 dialogAPI。

    hasDialogApi(): boolean {
        var context: any = Office.context;
        try {
            return context.requirements.isSetSupported('DialogAPI', '1.1');
        } catch (ex) {
            return false;
        }
    }

如果 dialogAPI 不可用(旧版 Outlook 2016、Outlook 网络客户端),我们将回退到基于弹出窗口的身份验证流程。我们使用基于弹出窗口并结合 SignalR/WebSockets 的登录机制来实现这样的流程。请参阅 this post and this one 以了解更多信息。

结论:在撰写本文时,使用 dialogAPI 构建的 Outlook 桌面还不是很普遍,但我们看到越来越多的用户使用它们。 dialogAPI 对于我们的加载项开发人员来说至关重要,因为对于没有 dialogAPI 的 Outlook 桌面,大多数时候基于弹出窗口的身份验证方案将不起作用(弹出窗口被禁用,web 套接字被禁止等)。目前,不带 dialogAPI 的 Outlook 桌面代表了 Keluro 上最大的登录用户。

注意:要在 Outlook 桌面中调试 iFrame,您可能会对 this 感兴趣。