Outlook WebAddin выдает внутреннюю ошибку сервера при регистрации Office.EventType.ItemChanged - PullRequest
0 голосов
/ 12 июня 2018

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

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

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

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

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

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

outlookDiagnostics :

{"хост": "Outlook", "платформа": "OfficeOnline", "версия": "16.0.9215.1000"}

1 Ответ

0 голосов
/ 31 августа 2019

Я мог бы выяснить следующие варианты поведения при регистрации события 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;
        });
    });
});
...