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:
- Вы не можете зарегистрировать более одного обработчика событий. Большинство людей получают ошибку, когда пытаются зарегистрировать обработчик событий во второй раз, так что первый обработчик событий НЕ был отменен.
- Регистрация обработчика событий действует дольше, чем существует на веб-странице вашей надстройки. Это означает, что когда ваша надстройка выгружает текущую веб-страницу и перезагружает ту же или другую веб-страницу (т. Е. Переходит на другую веб-страницу), регистрация вашего обработчика событий все равно сохраняется.
- При отмене регистрации обработчика событий вам необходимо не только указать имя функции-обработчика, но также убедиться, что функция точно такая же, как вы использовали для регистрации события. Другими словами, если вы попытаетесь отменить регистрацию обработчика событий ПОСЛЕ перезагрузки веб-страницы, объект функции обработчика будет другим, и, следовательно, обработчик событий не будет отменен.
- Регистрация обработчика событий теряется, когда 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;
});
});
});