我尝试开发一个Outlook AddIn,它允许我将Outlook中的日历条目与外部Web应用程序保持同步 . 所以基本上有两种情况:

  • 用户在Outlook中更新AppointmentItem,这些更改应传播到Web应用程序

  • 用户更新Web应用程序中的 Session ,这些更改应传播到Outlook(通过* .ics附件)

我的AddIn尝试处理日历更改事件,如下所示:

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日历的正确更新?