Поделиться через


Доступ к повторяющимся сериям с помощью EWS в Exchange

Узнайте, как получить доступ к элементу календаря в повторяющейся серии с помощью управляемого API EWS или EWS в Exchange.

Повторяющаяся серия встреч или собраний состоит из повторяющегося мастера, ряда случаев в серии, повторяющихся в соответствии с установленным шаблоном, и, необязательно, наборов вхождений, которые были изменены и удалены. Вы можете использовать управляемый API или EWS EWS для доступа к пунктам календаря в повторяющихся сериях. Это позволяет:

  • Проверьте, является ли элемент календаря, связанный с ИД элемента повторяющимся мастером, возникновением в серии или исключением из серии.

  • Поиск папки календаря для повторных встреч.

  • Получить связанные элементы календаря повторяемости

  • Итерировать с помощью вхождений в серии, исключений из возникновения или исключений возникновения.

Получите коллекцию повторяющихся элементов календаря с помощью управляемого API EWS

Если вы хотите получить коллекцию встреч, вы можете использовать метод ExchangeService.FindAppointments для получения всех встреч между заданной датой начала и конца, а затем добавить все элементы календаря с типом встречи Вхождение или Исключение в коллекцию, как показано в следующем примере.

В этом примере предполагается, что вы сдали Exchange сервер и приобрели службу с именем объекта ExchangeService.

public static Collection<Appointment> FindRecurringCalendarItems(ExchangeService service, 
                                                                    DateTime startSearchDate, 
                                                                    DateTime endSearchDate)
{
    // Instantiate a collection to hold occurrences and exception calendar items.
    Collection<Appointment> foundAppointments = new Collection<Appointment>();
    // Create a calendar view to search the calendar folder and specify the properties to return.
    CalendarView calView = new CalendarView(startSearchDate, endSearchDate);
    calView.PropertySet = new PropertySet(BasePropertySet.IdOnly, 
                                            AppointmentSchema.Subject, 
                                            AppointmentSchema.Start, 
                                            AppointmentSchema.IsRecurring, 
                                            AppointmentSchema.AppointmentType);
    // Retrieve a collection of calendar items.
    FindItemsResults<Appointment> findResults = service.FindAppointments(WellKnownFolderName.Calendar, calView);
    // Add all calendar items in your view that are occurrences or exceptions to your collection.
    foreach (Appointment appt in findResults.Items)
    {
        if (appt.AppointmentType == AppointmentType.Occurrence || appt.AppointmentType == AppointmentType.Exception)
        {
            foundAppointments.Add(appt);
        }
        else
        {
            Console.WriteLine("Discarding calendar item of type {0}.", appt.AppointmentType);
        }
    }
    return foundAppointments;
}

Обратите внимание, что повторяющиеся элементы календаря не возвращаются при вызове в FindAppointments. Для получения повторяющихся мастеров или более общего подхода к извлечению элементов календаря необходимо использовать ExchangeService.FindItems. Затем можно использовать фильтр поиска для получения только элементов с датой начала, большей или равной дате выбора, и представление элемента, чтобы ограничить количество возвращаемого элемента. Обратите внимание, что повторяющийся мастер с датой начала раньше даты начала поиска не будет найден, даже если в этом диапазоне происходят инциденты.

В этом примере предполагается, что вы сдали Exchange сервер и приобрели службу с именем объекта ExchangeService.

public static Collection<Appointment> FindCalendarItemsByAppointmentType(ExchangeService service, 
                                                                         AppointmentType myAppointmentType, 
                                                                         DateTime startSearchDate)
{
    Collection<Appointment> foundAppointments = new Collection<Appointment>();
    // Create a search filter based on the start search date.
    SearchFilter.SearchFilterCollection searchFilter = new SearchFilter.SearchFilterCollection();
    searchFilter.Add(new SearchFilter.IsGreaterThanOrEqualTo(AppointmentSchema.Start, startSearchDate));
    // Create an item view to specify which properties to return.
    ItemView view = new ItemView(20);
    view.PropertySet = new PropertySet(BasePropertySet.IdOnly, 
                                       AppointmentSchema.Subject, 
                                       AppointmentSchema.Start, 
                                       AppointmentSchema.AppointmentType,
                                       AppointmentSchema.IsRecurring);
    // Get the appointment items from the server with the properties we specified.
    FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Calendar, searchFilter, view);
    // Add each of the appointments of the type you want to the collection.
    foreach (Item item in findResults.Items)
    {
        Appointment appt = item as Appointment;
        if (appt.AppointmentType == myAppointmentType)
        {
            foundAppointments.Add(appt);
        }
    }
    return foundAppointments;
}

Иногда у вас есть один фрагмент головоломки, но для ее решения вам нужны остальные части. Если у вас есть ID элемента для элемента календаря повторения, вы можете получить другие части, необходимые с помощью одного из нескольких свойств или методов управляемого API EWS.

Таблица 1. Свойство или метод управляемого API EWS для получения связанных элементов календаря повторения

Если у вас есть ID элемента для... Вы можете получить... С помощью...
Повторяющийся элемент календаря
Первое появление в серии
Последнее появление в серии
Исключения из серии
Удаленные встречи в серии
Любое возникновение (с учетом его индекса)
Свойство Appointment.FirstOccurrence
Свойство Appointment.LastOccurrence
Свойство Appointment.ModifiedOccurrences
Свойство Appointment.DeletedOccurrences
Метод Appointment.BindToOccurrence
Одно появление в серии
Повторяющийся мастер
Метод Appointment.BindToRecurringMaster
Любой элемент календаря (объект назначения)
Значение переумерия типа назначения
Свойство Appointment.AppointmentType

В следующем примере кода показано, как получить повторяющийся мастер, первое или последнее появление в серии или возникновение с учетом его индекса.

В этом примере предполагается, что вы сдали Exchange сервер и приобрели службу с именем объекта ExchangeService.

public static void GetRelatedRecurrenceCalendarItems(ExchangeService service, ItemId itemId)
{
    Appointment calendarItem = Appointment.Bind(service, itemId, new PropertySet(AppointmentSchema.AppointmentType));
    Appointment recurrMaster = new Appointment(service);
    PropertySet props = new PropertySet(AppointmentSchema.AppointmentType,
                                        AppointmentSchema.Subject,
                                        AppointmentSchema.FirstOccurrence,
                                        AppointmentSchema.LastOccurrence,
                                        AppointmentSchema.ModifiedOccurrences,
                                        AppointmentSchema.DeletedOccurrences);
    // If the item ID is not for a recurring master, retrieve the recurring master for the series.
    switch (calendarItem.AppointmentType)
    {
        // Calendar item is a recurring master so use Appointment.Bind
        case AppointmentType.RecurringMaster:
            recurrMaster = Appointment.Bind(service, itemId, props);
            break;
        // The calendar item is a single instance meeting, so there are no instances to modify or delete.
        case AppointmentType.Single:
            Console.WriteLine("Item id must reference a calendar item that is part of a recurring series.");
            return;
        // The calendar item is an occurrence in the series, so use BindToRecurringMaster.
        case AppointmentType.Occurrence:
            recurrMaster = Appointment.BindToRecurringMaster(service, itemId, props);
            break;
        // The calendar item is an exception to the series, so use BindToRecurringMaster.                
        case AppointmentType.Exception:
            recurrMaster = Appointment.BindToRecurringMaster(service, itemId, props);
            break;
    }
    // View the first occurrence, last occurrence, and number of modified and deleted occurrences associated with the recurring master.
    Console.WriteLine("Information for the {0} recurring series:", recurrMaster.Subject);
    Console.WriteLine("The start time for the first appointment with id \t{0} was on \t{1}.", 
                        recurrMaster.FirstOccurrence.ItemId.ToString().Substring(144), 
                        recurrMaster.FirstOccurrence.Start.ToString());
    Console.WriteLine("The start time for the last appointment with id \t{0} will be on \t{1}.", 
                        recurrMaster.LastOccurrence.ItemId.ToString().Substring(144), 
                        recurrMaster.LastOccurrence.Start.ToString());
    Console.WriteLine("There are {0} modified occurrences and {1} deleted occurrences.", 
                        recurrMaster.ModifiedOccurrences == null ? "no" : recurrMaster.ModifiedOccurrences.Count.ToString(), 
                        recurrMaster.DeletedOccurrences == null ? "no" : recurrMaster.DeletedOccurrences.Count.ToString());
    // Bind to the first occurrence of a series by using its index.
    Appointment firstOccurrence = Appointment.BindToOccurrence(service, 
                                                                recurrMaster.Id, 
                                                                1, // Index of first item is 1, not 0.
                                                                new PropertySet(AppointmentSchema.AppointmentType,
                                                                                AppointmentSchema.Start));
    Console.WriteLine("Compare the start times for a recurring master's first occurrence " + 
                        "and the occurrence found at index 1 using the BindToOccurrence method:");
    Console.WriteLine("The appointment at index 1 has a start time of\t\t\t\t {0}\n" +
                        "Which matches that of the first occurrence on the recurring master: \t {1}",
                        firstOccurrence.Start.ToString(),
                        recurrMaster.FirstOccurrence.Start.ToString());
}

Доступ к элементу календаря в повторяющейся серии с помощью EWS

Доступ к пунктам календаря в повторяющейся серии очень похож на доступ к одиночным экземплярам элементов календаря. Вы используете запрос на операцию GetItem с указанием необходимых свойств с помощью occurrenceItemId необходимого экземпляра назначения. OccurrenceItemId содержит itemID повторяющегося мастера возникновения, а также его значение индекса в серии.

В следующем XML показан запрос GetItem, используемый для возврата события в серии, указанной индексом. Обратите внимание, что itemID повторяющегося мастера был сокращен для читаемости.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
               xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages" 
               xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types" 
               xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2010" />
  </soap:Header>
  <soap:Body>
    <m:GetItem>
      <m:ItemShape>
        <t:BaseShape>IdOnly</t:BaseShape>
        <t:AdditionalProperties>
          <t:FieldURI FieldURI="calendar:CalendarItemType" />
          <t:FieldURI FieldURI="calendar:Start" />
        </t:AdditionalProperties>
      </m:ItemShape>
      <m:ItemIds>
        <t:OccurrenceItemId RecurringMasterId="AAMkA" InstanceIndex="1" />
      </m:ItemIds>
    </m:GetItem>
  </soap:Body>
</soap:Envelope>

Сервер отвечает на запрос GetItem сообщением GetItemResponse, которое включает значение ResponseCode NoError, которое указывает на успешность создания электронной почты, и ItemId вновь созданного сообщения.

См. также