我尝试开发一个Outlook加载项,使我可以使Outlook中的日历项与外部Web应用程序保持同步。因此,基本上有两种情况:
我的加载项尝试处理日历更改事件,如下所示:
Outlook.MAPIFolder calendarFolder =
this.Application.ActiveExplorer().Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar);
_CalendarItems = calendarFolder.Items;
[...]
_CalendarItems.ItemChange += Item_Change;
在Item_Change方法中,我基本上尝试处理更改:
if (myAppointment.StartUTC != MyWebAppMeeting.getDateTime())
{
Meeting myMeeting = myMyWebAppAPI.PostMeeting(meetingIdLong, myAppointment.GlobalAppointmentID, MyWebAppMeeting.title, myAppointment.Body, myAppointment.StartUTC, ...;
}
使用此句柄,我假设AppointmentItem已更新,我需要将这些更改传播到我的Web应用程序。
测试此实现可以发现以下内容: 当Web应用程序使用带有ICS附件的邮件向我的日历发送更新时,将触发Item_Change。但是... AppointmentItem目前尚未更新。这导致我用AppointmentItem中的OLD StartUTC值更新Web应用程序的事实!
您可能会说,为什么不使用Web应用程序中的新值。
好吧,正如我一开始试图指出的那样,我需要处理2种情况(通过Outlook更新和通过Web应用程序更新)。因此,如果我选择使用Web应用程序提供的值,则当用户在Outlook中移动AppointmentItem并由此触发Item_Change时,我将无法处理这种情况。在这种情况下,我当然会在AppointmentItem.Start_UTC中收到正确的值,以传播到Web应用程序。
那么关键是如何正确处理Outlook日历的更新?