Jquery OfficeJs中removeAttachmentAsync()出现意外行为

Jquery OfficeJs中removeAttachmentAsync()出现意外行为,jquery,outlook-addin,office-js,Jquery,Outlook Addin,Office Js,我刚刚在OfficeJs中的removeAttachmentAsync()中遇到了一些意外行为。直到最近(几周),功能是一致的,对我们的案例有效,然后我们似乎看到一些奇怪的事情发生 因此,我们有一个按钮,通过撰写页面上的addFileAttachmentAsync()添加附件,然后将附件id保存到会话中以备将来使用,然后按钮逻辑反转为使用removeAttachmentAsync()在会话中使用保存的附件id删除所述附件。请记住,在添加附件时,我们会等待并验证附件是否已完全添加,然后用户才能执行

我刚刚在OfficeJs中的
removeAttachmentAsync()
中遇到了一些意外行为。直到最近(几周),功能是一致的,对我们的案例有效,然后我们似乎看到一些奇怪的事情发生

因此,我们有一个按钮,通过撰写页面上的
addFileAttachmentAsync()
添加附件,然后将附件id保存到会话中以备将来使用,然后按钮逻辑反转为使用
removeAttachmentAsync()
在会话中使用保存的附件id删除所述附件。请记住,在添加附件时,我们会等待并验证附件是否已完全添加,然后用户才能执行其他操作。然后,用户可以选择转到设置页面

验证附件是否已成功添加:

status: "succeeded"
value: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxx" // ${attachment_id}
这就是有趣的地方,如果用户添加附件,然后转到“设置”页面,然后返回到“撰写”页面,并选择删除附件,我们会收到此错误,但OfficeJs正在删除附件:

error: Object { name: "AttachmentDeletedBeforeUploadCompletes",
   message: "The user removed the attachment before upload has completed.",
   code: 9006 }
   status: "failed"
   value: null
但是,下面是OfficeJS对Exchange服务器执行的DeleteAttachment操作:

网址: 答复:

{
    "Body":{
        "ResponseMessages":{
            "Items":[
                {
                    "__type":"DeleteAttachmentResponseMessage:#Exchange",
                    "ResponseCode":"NoError",
                    "ResponseClass":"Success",
                    "RootItemId":{
                        "RootItemChangeKey":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
                        "RootItemId":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx="
                    }
                }
            ]
        }
    }
}
此行为不一致Exchange server表示成功,OfficeJs表示失败

以下是我删除附件的代码:

      function remove() {
            $.ajax({
              url: "/getattachment",
              dataType: 'json',
              cache: false
            }).always(function(res) {
              if(res.id) {
                Office.context.mailbox.item.removeAttachmentAsync(res.id,{asyncContext: null}, function (asyncResult) {
                    // Display the result to the user
                    if (asyncResult.status == Office.AsyncResultStatus.Succeeded) {
                      if (typeof Office.context.mailbox.item.notificationMessages === 'undefined') {
                        sidepane_status('success', 'Attachment removed.');
                      } else {
                        update_status('encryption-off', 'Attachment removed..');
                      }
                      attachment_id = null;
                    } else {
                      sidepane_status('error', 'Unable to remove attachment: ' + asyncResult.error.message);
                    }
                  }
                );
              } else {
                sidepane_status('error', 'Unable to remove attachment: ' + asyncResult.error.message);
              }
            });
          }
在MS文档中,我看到:

“在Outlook Web App和OWA for Devices中,附件标识符仅在同一会话中有效。当用户关闭应用程序时,或当用户开始以内联表单进行创作,然后弹出内联表单以在单独窗口中继续时,会话结束。”

但在这种情况下,用户没有关闭应用程序,仍然在使用相同的会话,并且没有编写内联表单

有人知道最近发生了什么变化,或者对可能发生的事情有什么见解吗

TLDR;调用了
removeAttachmentAsync()
,删除了附件,但OfficeJs返回失败,因为“用户在上载完成之前删除了附件。”

更新1:附件代码

function add() {
  $.ajax({
    url: "/attachment",
    dataType: 'json',
    cache: false
  }).done(function(response) {
    if(typeof response.attachment_name !== "undefined" && typeof response.attachment_url !== 'undefined') {
      Office.context.mailbox.item.addFileAttachmentAsync(response.attachment_url, response.attachment_name, { asyncContext: null }, function(asyncResult) {
          if(asyncResult.status == Office.AsyncResultStatus.Succeeded) {
            if(typeof Office.context.mailbox.item.notificationMessages === 'undefined') {
              sidepane_status('success', 'Attachment successfully added');
            } else {
              update_status('encryption-on', 'Attachment successfully added.');
            }
            attachment_id = asyncResult.value;
            $.ajax({
              url: "/saveattachment/" + attachment_id,
              dataType: 'json',
              cache: false
            }).always(function() {
              // Hide an Element
            });
          } else {
            sidepane_status('error', 'Unable to add attachment: ' + asyncResult.error.message);
          }
        }
      );
    } else {
      sidepane_status('error', 'Unable to retrieve attachment information');
    }
  });
}

请记住,用户使用
add()
添加附件,我们保存附件id,用户通过超链接进入新页面,然后通过另一个超链接返回。由于我们保存了附件id,然后使用它删除带有
remove()

的附件,因此无法重现此问题。感谢您共享removeAttachmentAsync代码。您是否也可以共享addFileAttachmentAsync代码以帮助我们端到端地调查此问题?使用附件添加代码进行了更新,并复制了更多的上下文。不幸的是,我们仍然无法使用简单的测试用例重新编程,这使我们相信您的外接程序具有独特性。您可以提供外接程序,或者提供一个非常简单的测试用例来重新处理问题吗?同样重要的是,这是在每一个浏览器上复制还是只在某些浏览器上复制?这也是100%复制吗?@OutlookAdd insTeam MSFT没有问题,您可以用Github或Bitbucket用户id ping我,这样我就可以将您添加到私有回购中。我不想把整个插件发布在开放的互联网上,我希望你能理解。而且,它不是100%可复制的,但可能有80%的时间是可以复制的。然而,这只发生在OWA中,而且它似乎与浏览器无关。我们无法重现这个问题。感谢您共享removeAttachmentAsync代码。您是否也可以共享addFileAttachmentAsync代码以帮助我们端到端地调查此问题?使用附件添加代码进行了更新,并复制了更多的上下文。不幸的是,我们仍然无法使用简单的测试用例重新编程,这使我们相信您的外接程序具有独特性。您可以提供外接程序,或者提供一个非常简单的测试用例来重新处理问题吗?同样重要的是,这是在每一个浏览器上复制还是只在某些浏览器上复制?这也是100%复制吗?@OutlookAdd insTeam MSFT没有问题,您可以用Github或Bitbucket用户id ping我,这样我就可以将您添加到私有回购中。我不想把整个插件发布在开放的互联网上,我希望你能理解。而且,它不是100%可复制的,但可能有80%的时间是可以复制的。然而,这只发生在OWA中,而且它似乎与浏览器无关。