Outlook WebAddin выдает внутреннюю ошибку сервера при регистрации Office.EventType.ItemChanged

В моем Outlook WebAddin я пытаюсь зарегистрироваться для почтового события ItemChange, используя код ниже.

    Office.context.mailbox.addHandlerAsync(Office.EventType.ItemChanged, mailItemSelectionChanged, [], function (result) {
            if(result && result.status != 'succeeded'){
                console.error('result => ' + result);
             }
});

Всякий раз, когда пользователь меняет почту в закрепленном режиме, я впервые получаю сообщение об изменении почты. затем, если в разговоре произошли изменения, я перезагружаю плагин с помощью location.reload(), чтобы очистить кеш и загрузить надстройку заново.

После перезагрузки плагина, он не может зарегистрировать событие mail ItemChange и выдает ошибку ниже:

{"code": 5001, "message": "Произошла внутренняя ошибка.", "name": "Internal Error"}

Он не работает в браузере и некоторых машинах Windows(работает во многих других случаях).

outlookDiagnostics:

{"host": "Outlook", "platform": "OfficeOnline", "version": "16.0.9215.1000"}

0 ответов

Я смог выяснить следующее поведение в отношении регистрации события Office.EventType.ItemChanged:

  1. Вы не можете зарегистрировать более одного обработчика событий. Большинство людей получают ошибку, когда пытаются зарегистрировать обработчик событий во второй раз, так что первый обработчик событий НЕ был отменен.
  2. Регистрация обработчика событий действует дольше, чем существует на веб-странице вашей надстройки. Это означает, что когда ваша надстройка выгружает текущую веб-страницу и перезагружает ту же или другую веб-страницу (т. Е. Переходит на другую веб-страницу), регистрация вашего обработчика событий все равно сохраняется.
  3. При отмене регистрации обработчика событий вам необходимо не только указать имя функции-обработчика, но также убедиться, что функция точно такая же, как вы использовали для регистрации события. Другими словами, если вы попытаетесь отменить регистрацию обработчика событий ПОСЛЕ перезагрузки веб-страницы, объект функции обработчика будет другим, и, следовательно, обработчик событий не будет отменен.
  4. Регистрация обработчика событий теряется, когда Outlook закрывает область надстройки.

Итак, в вашем случае вам нужно отменить регистрацию события перед вызовом location.reload(), как показано ниже.

Office.context.mailbox.removeHandlerAsync(Office.EventType.ItemChanged, {handler: mailItemSelectionChanged}, function(result) {
    if (result.status === Office.AsyncResultStatus.Failed) {
        console.log('Item Change event could not be unregistered.');
        console.log(result.error);
    }
    else {
        console.log('Item Change event unregistered successfully.');
    }
});
setTimeout(function() {location.reload();}, 100);

Те, кто хочет перейти на ту же или другую веб-страницу из своей надстройки, могут прикрепить обработчики событий щелчка к тегам привязки (или кнопкам), чтобы гарантировать, что обработчики событий ItemChanged были разрегистрированы до выгрузки текущей страницы.. Я сделал это с помощью следующего кода:

$(document).ready(function() {
    $('.NavBarContainer a').toArray().forEach(function(anchor1, index) {
        $(anchor1).click(function(event) {
            if(itemChangeEventRegistered) {
                unregisterItemChangeHandler();
                setTimeout(function() {window.location = anchor1.href;}, 100);
                return false;
            }
            return true;
        });
    });
});
Другие вопросы по тегам