Доступ к повторяющимся сериям с помощью 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;
}
Получите связанные элементы календаря повторения с помощью управляемого API EWS
Иногда у вас есть один фрагмент головоломки, но для ее решения вам нужны остальные части. Если у вас есть 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 вновь созданного сообщения.