【问题标题】:Getting Room Appointments Efficiently from Exchange从 Exchange 有效地进行房间预约
【发布时间】:2013-02-06 07:24:03
【问题描述】:

问题

我需要能够使用 Exchange 托管 API 从会议室获取约会数据。我已经运行了大约一个月的服务,通过使用ExchangeService.GetUserAvailability() 可以很好地达到此目的,如下所示:

private IEnumerable<CalendarEvent> GetEvents(ExchangeService ExchangeService, string room, DateTime time, DateTime end)
{
    List<AttendeeInfo> attendees = new List<AttendeeInfo>();
    end = new DateTime(time.Ticks + Math.Max(end.Ticks - time.Ticks, time.AddDays(1).Ticks - time.Ticks));

    AttendeeInfo roomAttendee = new AttendeeInfo();
    roomAttendee.AttendeeType = MeetingAttendeeType.Room;
    roomAttendee.SmtpAddress = GetEmailAddress(room);
    attendees.Add(roomAttendee);

    Collection<CalendarEvent> events = ExchangeService.GetUserAvailability(
                attendees,
                new TimeWindow(time, end),
                AvailabilityData.FreeBusy
            ).AttendeesAvailability[0].CalendarEvents;

    return (from e in events
            where e.EndTime > time
            select e);
}

但是,我最近不得不扩展这项服务来执行一些需要更长时间跨度(从一天到几个月)的其他任务。这种方法随着时间的增加变得非常低效,并且当结果太多时偶尔会抛出错误。

问题

这是解决此问题的最有效方法吗?我没有找到更好的方法,但我将不胜感激。

【问题讨论】:

  • 请注意,GetEmailAddress() 是一个本地函数,它从配置文件中获取电子邮件后缀并添加到末尾。

标签: .net wcf calendar exchange-server ews-managed-api


【解决方案1】:

您可以尝试使用ExchangeService.FindItems,它使您能够:

  • 使用分页来获取大量结果集。
  • 选择要从服务器获取的字段
  • 指定可以过滤此查询服务器端的 SearchFilter:

    来自事件中的 e 其中 e.EndTime > 时间 选择e

【讨论】:

  • 原来你在 CalendarFolders 上调用它的方式与你在邮件项目上的调用方式略有不同,所以我无法远程应用过滤器,但这不是问题。这将在其上运行的服务器负载不重,因此从 Exchange 中删除一些内容绝不是一件坏事;)谢谢!
【解决方案2】:

我使用委托,希望有用。代码示例...

      ExchangeService service = new ExchangeService();
      ServicePointManager.ServerCertificateValidationCallback = CertificateValidationCallBack;
      service.Credentials = new NetworkCredential(username, password);
      service.Url = new Uri("...");


      List<DelegateUser> newDelegates = new System.Collections.Generic.List<DelegateUser>();
      DelegateUser calendarDelegate = new DelegateUser(roomemail);
      calendarDelegate.Permissions.CalendarFolderPermissionLevel = DelegateFolderPermissionLevel.Reviewer;
      newDelegates.Add(calendarDelegate);   

【讨论】:

    猜你喜欢
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    相关资源
    最近更新 更多