Создание повторяющегося ряда с помощью EWS в Exchange
Узнайте, как создавать повторяющиеся собрания с помощью управляемого API EWS или EWS в Exchange.
Создание повторяющейся встречи или собрания не сильно отличается от создания встречи или собрания одного экземпляра. Вам просто нужно назначить значения нескольким дополнительным свойствам, связанным с повторением. Они задаются в объекте Recurrence объекта ExchangeService.Appointment (если вы используете управляемый API EWS) или дочернем элементе Recurrence элемента CalendarItem (если вы используете EWS). При создании повторяющегося, а не одного экземпляра собрания следует учитывать, что создаваемый элемент календаря является повторяющимся главным элементом для ряда. Ряд свойств задается только для повторяющегося главного экземпляра; Эти свойства помогают находить, изменять или удалять отдельные экземпляры в ряде. По этой причине может быть полезно отслеживать идентификатор повторяющегося образца при создании повторяющегося ряда.
Таблица 1. Свойства, заданные для повторяющихся элементов главного календаря
Класс или свойство Управляемого API EWS | XML-элемент EWS | Описание |
---|---|---|
Класс Recurrence Класс Recurrence является базовым классом для производного класса шаблонов IntervalPattern, RelativeYearlyPattern или YearlyPattern. |
Recurrence (RecurrenceType) |
Содержит сведения, связанные с повторением, включая шаблон повторения (ежедневно, еженедельно, ежемесячно и т. д.), дату начала и окончания, количество вхождений и т. д. |
Свойство FirstOccurrence |
FirstOccurrence |
Содержит время начала и окончания, а также идентификатор элемента для первого собрания в ряду. |
Свойство LastOccurrence |
LastOccurrence |
Содержит время начала и окончания, а также идентификатор элемента для последнего собрания в ряду. |
Свойство ModifiedOccurrences |
ModifiedOccurrences |
Содержит набор всех собраний в серии, которые были изменены по исходному шаблону повторения. |
Свойство DeletedOccurrences |
DeletedOccurrences |
Содержит набор всех собраний в серии, которые были удалены из исходного шаблона повторения. |
Так как собрания по сути являются встречами, включающими участников, в примерах кода в этой статье показано, как создавать повторяющиеся собрания. Если вы хотите создать повторяющуюся встречу, можно изменить примеры, удалив код, связанный с участниками.
Создание повторяющегося собрания с помощью управляемого API EWS
В следующем примере кода показано, как создать повторяющееся собрание. Сначала назначьте значения свойствам объекта Appointment , используемого для создания собрания, а затем используйте метод Сохранить , чтобы сохранить повторяющийся ряд в папке календаря и отправить приглашения на собрание участникам. Наконец, используйте метод Appointment.Bind , чтобы просмотреть значения, заданные для повторяющегося образца для только что созданного ряда.
В этом примере предполагается, что вы прошли проверку подлинности на сервере Exchange Server и получили объект ExchangeService под именем service. Метод в этом примере возвращает идентификатор элемента повторяющегося хозяина ряда.
public static ItemId CreateARecurringMeeting(ExchangeService service)
{ Appointment recurrMeeting = new Appointment(service);
// Set the properties you need to create a meeting.
recurrMeeting.Subject = "Weekly Update Meeting";
recurrMeeting.Body = "Come hear about how the project is coming along!";
recurrMeeting.Start = DateTime.Now.AddDays(1);
recurrMeeting.End = recurrMeeting.Start.AddHours(1);
recurrMeeting.Location = "Contoso Main Gallery";
recurrMeeting.RequiredAttendees.Add("Mack@contoso.com");
recurrMeeting.RequiredAttendees.Add("Sadie@contoso.com");
recurrMeeting.RequiredAttendees.Add("Magdalena@contoso.com"); recurrMeeting.ReminderMinutesBeforeStart = 30;
DayOfTheWeek[] dow = new DayOfTheWeek[] { (DayOfTheWeek)recurrMeeting.Start.DayOfWeek };
// The following are the recurrence-specific properties for the meeting.
recurrMeeting.Recurrence = new Recurrence.WeeklyPattern(recurrMeeting.Start.Date, 1, dow);
recurrMeeting.Recurrence.StartDate = recurrMeeting.Start.Date;
recurrMeeting.Recurrence.NumberOfOccurrences = 10;
// This method results in in a CreateItem call to EWS.
recurrMeeting.Save(SendInvitationsMode.SendToAllAndSaveCopy);
// Retrieve the meeting subject and the properties that are set on a recurring master when a recurring series is created.
recurrMeeting = Appointment.Bind(service, recurrMeeting.Id, new PropertySet(AppointmentSchema.Subject,
AppointmentSchema.AppointmentType,
AppointmentSchema.Recurrence,
AppointmentSchema.FirstOccurrence,
AppointmentSchema.LastOccurrence,
AppointmentSchema.ModifiedOccurrences,
AppointmentSchema.DeletedOccurrences));
// Print out the recurring master properties.
Console.WriteLine("\nAppointment created: " + recurrMeeting.Subject);
Console.WriteLine("Appointment Type: {0}\n", recurrMeeting.AppointmentType);
Console.WriteLine("These property values are always null unless the item is a recurring master:\n");
Console.WriteLine("\tRecurrence pattern: {0}", recurrMeeting.Recurrence.ToString());
Console.WriteLine("\tRecurring series start Date: {0}", recurrMeeting.Recurrence.StartDate.ToString());
Console.WriteLine("\tRecurring series end Date: {0}",
recurrMeeting.Recurrence.EndDate == null ? "Null" : recurrMeeting.Recurrence.EndDate.ToString());
Console.WriteLine("\tHas end: {0}", recurrMeeting.Recurrence.HasEnd.ToString());
Console.WriteLine("\tNumber of occurrances: {0}", recurrMeeting.Recurrence.NumberOfOccurrences);
Console.WriteLine("\tLast 24 characters of the first occurrence's item ID:\t {0}",
recurrMeeting.FirstOccurrence.ItemId.ToString().Substring(144));
Console.WriteLine("\tLast 24 characters of the last occurrence's item ID:\t {0}",
recurrMeeting.LastOccurrence.ItemId.ToString().Substring(144));
Console.WriteLine("\tModified Occurrences: {0}",
(recurrMeeting.ModifiedOccurrences == null ? "Null" : recurrMeeting.ModifiedOccurrences.Count.ToString()));
Console.WriteLine("\tDeleted Occurrences: {0}",
recurrMeeting.DeletedOccurrences == null ? "Null" : recurrMeeting.ModifiedOccurrences.Count.ToString());
// Return the ID of the recurring master.
return recurrMeeting.Id;
}
Создание повторяющегося собрания с помощью EWS
XML-код запроса и ответа в следующих примерах соответствует вызовам, выполняемым для создания повторяющегося собрания с помощью управляемого API EWS. Обратите внимание, что за исключением задания значений, зависящих от повторения, в элементе Recurrence запрос по существу совпадает с тем, который вы используете для создания встречи с одним экземпляром. В следующем примере показан XML-код запроса при использовании операции CreateItem для создания собрания.
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<t:RequestServerVersion Version="Exchange2010" />
<t:TimeZoneContext>
<t:TimeZoneDefinition Name="(UTC-08:00) Pacific Time (US &amp; Canada)" Id="Pacific Standard Time">
<t:Periods>
<t:Period Bias="P0DT8H0M0.0S" Name="Standard" Id="Std" />
<t:Period Bias="P0DT7H0M0.0S" Name="Daylight" Id="Dlt/1" />
<t:Period Bias="P0DT7H0M0.0S" Name="Daylight" Id="Dlt/2007" />
</t:Periods>
<t:TransitionsGroups>
<t:TransitionsGroup Id="0">
<t:RecurringDayTransition>
<t:To Kind="Period">Dlt/1</t:To>
<t:TimeOffset>P0DT2H0M0.0S</t:TimeOffset>
<t:Month>4</t:Month>
<t:DayOfWeek>Sunday</t:DayOfWeek>
<t:Occurrence>1</t:Occurrence>
</t:RecurringDayTransition>
<t:RecurringDayTransition>
<t:To Kind="Period">Std</t:To>
<t:TimeOffset>P0DT2H0M0.0S</t:TimeOffset>
<t:Month>10</t:Month>
<t:DayOfWeek>Sunday</t:DayOfWeek>
<t:Occurrence>-1</t:Occurrence>
</t:RecurringDayTransition>
</t:TransitionsGroup>
<t:TransitionsGroup Id="1">
<t:RecurringDayTransition>
<t:To Kind="Period">Dlt/2007</t:To>
<t:TimeOffset>P0DT2H0M0.0S</t:TimeOffset>
<t:Month>3</t:Month>
<t:DayOfWeek>Sunday</t:DayOfWeek>
<t:Occurrence>2</t:Occurrence>
</t:RecurringDayTransition>
<t:RecurringDayTransition>
<t:To Kind="Period">Std</t:To>
<t:TimeOffset>P0DT2H0M0.0S</t:TimeOffset>
<t:Month>11</t:Month>
<t:DayOfWeek>Sunday</t:DayOfWeek>
<t:Occurrence>1</t:Occurrence>
</t:RecurringDayTransition>
</t:TransitionsGroup>
</t:TransitionsGroups>
<t:Transitions>
<t:Transition>
<t:To Kind="Group">0</t:To>
</t:Transition>
<t:AbsoluteDateTransition>
<t:To Kind="Group">1</t:To>
<t:DateTime>2007-01-01T08:00:00.000Z</t:DateTime>
</t:AbsoluteDateTransition>
</t:Transitions>
</t:TimeZoneDefinition>
</t:TimeZoneContext>
</soap:Header>
<soap:Body>
<m:CreateItem SendMeetingInvitations="SendToAllAndSaveCopy">
<m:Items>
<t:CalendarItem>
<t:Subject>Weekly Update Meeting</t:Subject>
<t:Body BodyType="HTML">Come hear about how the Organized Observational Paradigm SkyNet project is coming along!</t:Body>
<t:ReminderMinutesBeforeStart>30</t:ReminderMinutesBeforeStart>
<t:Start>2014-03-08T13:21:32.868-08:00</t:Start>
<t:End>2014-03-08T14:21:32.868-08:00</t:End>
<t:Location>Contoso Main Gallery</t:Location>
<t:RequiredAttendees>
<t:Attendee>
<t:Mailbox>
<t:EmailAddress>Mack@contoso.com</t:EmailAddress>
</t:Mailbox>
</t:Attendee>
<t:Attendee>
<t:Mailbox>
<t:EmailAddress>Sadie@contoso.com</t:EmailAddress>
</t:Mailbox>
</t:Attendee>
<t:Attendee>
<t:Mailbox>
<t:EmailAddress>Magdalena@contoso.com</t:EmailAddress>
</t:Mailbox>
</t:Attendee>
</t:RequiredAttendees>
<t:Recurrence>
<t:WeeklyRecurrence>
<t:Interval>1</t:Interval>
<t:DaysOfWeek>Saturday</t:DaysOfWeek>
</t:WeeklyRecurrence>
<t:NumberedRecurrence>
<t:StartDate>2014-03-08-08:00</t:StartDate>
<t:NumberOfOccurrences>10</t:NumberOfOccurrences>
</t:NumberedRecurrence>
</t:Recurrence>
</t:CalendarItem>
</m:Items>
</m:CreateItem>
</soap:Body>
</soap:Envelope>
В следующем примере показан XML-отклик, возвращаемый операцией CreateItem.
Атрибуты ItemId и ChangeKey сокращены для удобства чтения.
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<h:ServerVersionInfo MajorVersion="15" MinorVersion="0" MajorBuildNumber="893" MinorBuildNumber="10"
Version="V2_10" xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<m:CreateItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<m:ResponseMessages>
<m:CreateItemResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:Items>
<t:CalendarItem>
<t:ItemId Id="AAMkAD" ChangeKey="DwAAAB" />
</t:CalendarItem>
</m:Items>
</m:CreateItemResponseMessage>
</m:ResponseMessages>
</m:CreateItemResponse>
</s:Body>
</s:Envelope>
В следующем примере показан XML-код запроса, который создается при использовании операции GetItem и ItemId для созданного ряда, а свойства запроса задаются только для повторяющегося образца, чтобы убедиться, что itemId , возвращенный сервером при создании повторяющегося ряда, предназначен для повторяющегося главного.
Атрибуты ItemId и ChangeKey сокращены для удобства чтения.
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://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="item:Subject" />
<t:FieldURI FieldURI="calendar:CalendarItemType" />
<t:FieldURI FieldURI="calendar:Recurrence" />
<t:FieldURI FieldURI="calendar:FirstOccurrence" />
<t:FieldURI FieldURI="calendar:LastOccurrence" />
<t:FieldURI FieldURI="calendar:ModifiedOccurrences" />
<t:FieldURI FieldURI="calendar:DeletedOccurrences" />
</t:AdditionalProperties>
</m:ItemShape>
<m:ItemIds>
<t:ItemId Id="AAMkAD" ChangeKey="DwAAAB" />
</m:ItemIds>
</m:GetItem>
</soap:Body>
</soap:Envelope>
В следующем примере показан XML-код ответа, возвращаемый операцией GetItem .
Атрибуты ItemId и ChangeKey сокращены для удобства чтения.
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<h:ServerVersionInfo MajorVersion="15" MinorVersion="0" MajorBuildNumber="893" MinorBuildNumber="10"
Version="V2_10" xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<m:GetItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<m:ResponseMessages>
<m:GetItemResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:Items>
<t:CalendarItem>
<t:ItemId Id="AAMkAD" ChangeKey="DwAAAB" />
<t:Subject>Weekly Update Meeting</t:Subject>
<t:CalendarItemType>RecurringMaster</t:CalendarItemType>
<t:Recurrence>
<t:WeeklyRecurrence>
<t:Interval>1</t:Interval>
<t:DaysOfWeek>Saturday</t:DaysOfWeek>
</t:WeeklyRecurrence>
<t:NumberedRecurrence>
<t:StartDate>2014-03-08-08:00</t:StartDate>
<t:NumberOfOccurrences>10</t:NumberOfOccurrences>
</t:NumberedRecurrence>
</t:Recurrence>
<t:FirstOccurrence>
<t:ItemId Id="AAMkAD" ChangeKey="DwAAABY" />
<t:Start>2014-03-08T21:21:00Z</t:Start>
<t:End>2014-03-08T22:21:00Z</t:End>
<t:OriginalStart>2014-03-08T21:21:00Z</t:OriginalStart>
</t:FirstOccurrence>
<t:LastOccurrence>
<t:ItemId Id="AAMkAD" ChangeKey="DwAAABY" />
<t:Start>2014-05-10T20:21:00Z</t:Start>
<t:End>2014-05-10T21:21:00Z</t:End>
<t:OriginalStart>2014-05-10T20:21:00Z</t:OriginalStart>
</t:LastOccurrence>
</t:CalendarItem>
</m:Items>
</m:GetItemResponseMessage>
</m:ResponseMessages>
</m:GetItemResponse>
</s:Body>
</s:Envelope>