2015-09-19 108 views
0

我聽Items.ItemChange()事件上MAPIFolder,並觸發該事件處理火災時:Outlook日曆API:。GetRecurrencePattern()異常總是空

private async void monitor_AppointmentModified(object sender, EventArgs<AppointmentItem> e) 
{ 
    var item = e.Value; 
    Debug.Print("Outlook Appointment Modified: {0}", item.GlobalAppointmentID); 

    try 
    { 
     var result = await GCalUtils.ModifyEventAsync(item); 
    } 
    catch (Exception ex) 
    { 
     PrintToDebug(ex); 
    } 
} 

其中要求公用事業類修改的事件推到谷歌日曆:

public static async Task<Event> ModifyEventAsync(AppointmentItem item, string calendarId = PrimaryCalendarId) 
{ 
    var gCalEventId = item.UserProperties.Find(Resources.GCalId); 

    var updateRequest = Service.Events.Update(item.AsGCalEvent(), calendarId, gCalEventId.Value.ToString()); 
    var result = await updateRequest.ExecuteAsync() as Event; 
    if (result != null && item.IsRecurring) 
     ModifyRecurrences(item, calendarId, result.Id); 

    return result; 
} 

...因此,如果該項目是一個反覆出現的AppointmentItem,我叫ModifyRecurrences:

private static async void ModifyRecurrences(AppointmentItem item, string calendarId, string eventId) 
{ 
    var exceptions = item.GetRecurrencePattern().Exceptions.Cast<Microsoft.Office.Interop.Outlook.Exception>().ToList(); 
    if (!exceptions.Any()) return; 

    // other stuff happens... eventually... hopefully 
} 

...但無論我對系列發生的實際做了什麼,無論是將項目移動到新時間,調整開始時間還是結束時間,還是完全刪除項目,exceptions.Any()致電總是返回假。有從來沒有集合中的任何異常,如果我正確理解概念,然後通過修改重複系列的實例我剛剛創建了一個異常,它應該顯示在異常集合

我懷疑我可能有一個陳舊的AppointmentItem副本,但我沒有線索如何驗證。

回答

0

這是Outlook對象模型中的一個已知問題 - 只有在約會完全解除引用並重新打開後,纔會看到異常。如果這是您目前正在編輯的約會,可能會有一段時間。

如果使用Redemption是一個選項,則可以繞過Outlook高速緩存並重新將約會重新打開爲RDOAppointmentItem對象。

Redemption.RDOSession session = new Redemption.RDOSession(); 
session.MAPIOBJECT = item.Application.Session.MAPIOBJECT; 
Redemption.RDOAppointmentItem rItem = (Redemption.RDOAppointmentItem)session.GetMessageFormID(item.EntryID); 
+0

不幸的是,贖回不是一種選擇。有關如何訪問OOM以避免此問題的任何指導? –

+0

我不認爲你可以使用OOM來解決這個問題。您可以嘗試檢索出現blob並解析它。 –

+0

你說,就好像我會知道如何。 :-) –