在 Exchange 中使用 EWS 创建定期序列
了解如何使用 Exchange 中的 EWS 托管 API 或 EWS 创建定期会议。
创建定期约会或会议与创建 单个实例约会或会议没有太大的不同。 只需将值分配给其他几个与重复周期相关的属性。 如果使用 EWS 托管 API) ,则会在 ExchangeService.Appointment 对象的 Recurrence 对象 (;如果使用 EWS) ,则会 (CalendarItem 元素的 Recurrence 子元素上设置这些元素。 创建定期会议(而不是单实例会议)时要考虑的一件事是,创建的日历项是系列的定期主控项。 许多属性仅在定期主控服务器上设置;这些属性可帮助你查找、修改或删除序列中的单个实例。 因此,在创建定期系列时,跟踪定期主控服务器的 ID 可能很有用。
表 1. 在定期主日历项目上设置的属性
EWS 托管 API 类或属性 | EWS XML 元素 | 说明 |
---|---|---|
Recurrence 类 Recurrence 类是派生模式类的基类,可以是 IntervalPattern、RelativeYearlyPattern 或 YearlyPattern。 |
Recurrence (RecurrenceType) |
包含与重复周期相关的信息,包括定期模式 (每日、每周、每月等) 、开始和结束日期、发生次数等。 |
FirstOccurrence 属性 |
FirstOccurrence |
包含系列中第一次会议的开始时间和结束时间以及项目 ID。 |
LastOccurrence 属性 |
LastOccurrence |
包含系列中最后一次会议的开始时间和结束时间以及项目 ID。 |
ModifiedOccurrences 属性 |
ModifiedOccurrences |
包含系列中已从原始重复模式修改的所有会议的集合。 |
DeletedOccurrences 属性 |
DeletedOccurrences |
包含系列中已从原始重复模式中删除的所有会议的集合。 |
由于会议实质上是包含与会者的约会,因此本文中的代码示例演示如何创建定期会议。 如果要创建定期约会,可以通过删除与与会者相关的代码来修改示例。
使用 EWS 托管 API 创建定期会议
下面的代码示例演示如何创建定期会议。 首先,将值分配给用于创建会议的 Appointment 对象的 属性,然后使用 Save 方法将定期系列保存到日历文件夹,并向与会者发送会议请求。 最后,使用 Appointment.Bind 方法查看刚刚创建的定期序列的定期主控形状上设置的值。
此示例假定已对 Exchange 服务器进行了身份验证,并且已获取名为 service 的 ExchangeService 对象。 此示例中的 方法返回定期序列的定期主控形状 的项目 ID 。
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 对应于 使用 EWS 托管 API 创建定期会议的调用。 请注意,除了在 Recurrence 元素上设置特定于重复周期的值外,请求本质上与用于创建单实例约会的请求相同。 以下示例演示使用 CreateItem 操作创建会议时的请求 XML。
<?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>
下面的示例演示由 CreateItem 操作返回的响应 XML。
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>
以下示例演示使用 GetItem 操作时生成的请求 XML 和创建的系列的 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>
以下示例显示 GetItem 操作返回的响应 XML。
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>