3

我们目前正致力于使用Exchange Web服务托管API在我们的产品和Exchange之间创建同步服务。具体而言,我们希望在用户日历上同步(按时间表)特定约会。作为同步的一部分,我们不一定要同步所有的约会,但已经建立了一些复杂的SearchFilters来只返回我们想要的约会。我们的问题是,为了使用SearchFilters,我们需要使用ExchangeService.FindItems方法,但此方法仅返回重复事件的主复现。我们的其他选择是使用ExchangeService.FindAppointment,这将为我们执行Recurrence Expansion,但有新问题,我们只能使用开始日期和结束日期限制结果约会。看看ExchangeService.FindAppointment是如何实现的,我们可以看到它是使用FindItems方法实现的,这使我相信我应该能够告诉ExchangeService.FindItems方法执行循环扩展。Exchange Web Services托管API:如何通过FindItem方法执行循环扩展?

如何从交换使用复杂的SearchFilter获取扩展约会列表?

回答

5

刚刚发现这个MSDN上: http://msdn.microsoft.com/en-us/library/hh148195(v=exchg.140).aspx

注意事项搜索日历约会

日历约会是搜索的一个特例。某些日历约会(例如重复约会)可能会有例外和已删除的事件。为确保Exchange服务器在搜索日历文件夹时扩展周期性约会,您需要使用日历分页。但是,当您使用日历分页时,不能使用任何其他搜索限制。这意味着,例如,如果您想在本月为特定组织者显示所有日历约会,则无法创建基于组织者的搜索过滤器。相反,您可以使用CalendarView类查询当月的所有约会,然后基于组织者过滤客户端上的约会。以下示例显示如何使用日历视图在日历中搜索约会。

0

对于任何使用FindAppointments/CalendarView发现guxiyou解决方案的人都不切实际,我的解决方案如下。在自动同步的情况下,CalendarView尤其不方便,因为您最好使用“上次修改”过滤器,而不是检索所有内容并过滤客户端,这不是非常高效。

我使用了支持过滤器的常规FindItems方法,并且在迭代约会时检查了AppointmentType,如果是RecurrenceMaster类型,它将查找链接的事件并将它们添加到待同步列表中。

下面的方法来随后得到这些约会的事件。没有结束日期的循环模式会被忽略,因为这会使循环无限。除非您限制同步窗口,否则必须以不同方式处理这些重复发生的情况,以便同步。

private IEnumerable<Appointment> GetRecurrentAppointments(Appointment masterAppointment) 
    { 
     Recurrence recurrence = masterAppointment.Recurrence; 

     if (recurrence == null || !recurrence.HasEnd) 
      yield break; 

     for (int i = 1; i <= recurrence.NumberOfOccurrences; i++) 
     { 
      Appointment occurrence = Appointment.BindToOccurrence(ExchangeServiceProxy, masterAppointment.Id, i); 

      yield return occurrence; 
     } 
    } 
相关问题