1

問題

Exchange マネージ API を使用して会議室から予定データを取得できるようにする必要があります。ExchangeService.GetUserAvailability()次のように使用することで、この目的をうまく果たすサービスを約1か月間実行しました。

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);
}

ただし、最近、このサービスを拡張して、より長い期間を必要とする他のタスクを実行する必要がありました (1 日から数か月になりました)。この方法は、時間の経過とともに非常に非効率になり、結果が多すぎるとエラーが発生することがあります。

質問

これはこれを行う最も効率的な方法ですか?これ以上の方法は見つかりませんでしたが、確認していただければ幸いです。

4

2 に答える 2

2

次のことを可能にするExchangeService.FindItemsを使用してみることができます。

  • ページネーションを使用して巨大な結果セットを取得します。
  • サーバーから取得するフィールドを選択します
  • このクエリ サーバー側をフィルタリングできる SearchFilter を指定します。

    from e in events where e.EndTime > time select e

于 2013-02-06T07:50:29.363 に答える
0

私はデリゲートを使います。コードサンプル...

      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);   
于 2014-12-22T12:38:57.777 に答える