在 Exchange 中使用 EWS 获取约会和会议
了解如何使用 Exchange 中的 EWS 托管 API 或 EWS 获取约会和会议。
可以使用 CalendarFolder.FindAppointments EWS 托管 API 方法或 FindItem EWS 操作从日历文件夹中检索约会和会议。
使用 EWS 托管 API 获取约会
下面的代码示例演示如何使用 EWS 托管 API 检索位于指定开始时间和结束时间之间的用户的约会。
// Initialize values for the start and end times, and the number of appointments to retrieve.
DateTime startDate = DateTime.Now;
DateTime endDate = startDate.AddDays(30);
const int NUM_APPTS = 5;
// Initialize the calendar folder object with only the folder ID.
CalendarFolder calendar = CalendarFolder.Bind(service, WellKnownFolderName.Calendar, new PropertySet());
// Set the start and end time and number of appointments to retrieve.
CalendarView cView = new CalendarView(startDate, endDate, NUM_APPTS);
// Limit the properties returned to the appointment's subject, start time, and end time.
cView.PropertySet = new PropertySet(AppointmentSchema.Subject, AppointmentSchema.Start, AppointmentSchema.End);
// Retrieve a collection of appointments by using the calendar view.
FindItemsResults<Appointment> appointments = calendar.FindAppointments(cView);
Console.WriteLine("\nThe first " + NUM_APPTS + " appointments on your calendar from " + startDate.Date.ToShortDateString() +
" to " + endDate.Date.ToShortDateString() + " are: \n");
foreach (Appointment a in appointments)
{
Console.Write("Subject: " + a.Subject.ToString() + " ");
Console.Write("Start: " + a.Start.ToString() + " ");
Console.Write("End: " + a.End.ToString());
Console.WriteLine();
}
下面是代码示例的输出。
The first five appointments on your calendar from 8/21/2013 to 9/20/2013 are:
Subject: Contoso devs team meeting Start: 8/21/2013 12:30:00 PM End: 8/21/2013 1:00:00 PM
Subject: Daily status meeting Start: 8/21/2013 1:00:00 PM End: 8/21/2013 2:00:00 PM
Subject: Lunch with sales team Start: 8/21/2013 2:30:00 PM End: 8/21/2013 3:30:00 PM
Subject: Tennis at the club Start: 8/22/2013 11:00:00 AM End: 8/22/2013 12:00:00 PM
Subject: Online training webcast: 8/22/2013 2:00:00 PM End: 8/22/2013 3:00:00 PM
使用 EWS 获取约会
以下 XML 显示用于返回 FindItem 操作的文件夹 ID 的 GetFolder 操作请求。
<?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="Exchange2007_SP1" />
</soap:Header>
<soap:Body>
<m:GetFolder>
<m:FolderShape>
<t:BaseShape>IdOnly</t:BaseShape>
</m:FolderShape>
<m:FolderIds>
<t:DistinguishedFolderId Id="calendar" />
</m:FolderIds>
</m:GetFolder>
</soap:Body>
</soap:Envelope>
以下 XML 显示 GetFolder 响应。 请注意,为了提高可读性, 将缩短 FolderID 和 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="731" MinorBuildNumber="10" Version="V2_3"
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:GetFolderResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<m:ResponseMessages>
<m:GetFolderResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:Folders>
<t:CalendarFolder>
<t:FolderId Id="AAMk" ChangeKey="AgAA" />
</t:CalendarFolder>
</m:Folders>
</m:GetFolderResponseMessage>
</m:ResponseMessages>
</m:GetFolderResponse>
</s:Body>
</s:Envelope>
以下 XML 显示用于返回所请求约会的 FindItem 请求。 请注意,为了提高可读性, 将缩短 FolderID 和 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="Exchange2007_SP1" />
</soap:Header>
<soap:Body>
<m:FindItem Traversal="Shallow">
<m:ItemShape>
<t:BaseShape>IdOnly</t:BaseShape>
<t:AdditionalProperties>
<t:FieldURI FieldURI="item:Subject" />
<t:FieldURI FieldURI="calendar:Start" />
<t:FieldURI FieldURI="calendar:End" />
</t:AdditionalProperties>
</m:ItemShape>
<m:CalendarView MaxEntriesReturned="5" StartDate="2013-08-21T17:30:24.127Z" EndDate="2013-09-20T17:30:24.127Z" />
<m:ParentFolderIds>
<t:FolderId Id="AAMk" ChangeKey="AgAA" />
</m:ParentFolderIds>
</m:FindItem>
</soap:Body>
</soap:Envelope>
以下 XML 显示 FindItem 响应。 请注意,为了提高可读性, 将缩短 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="731" MinorBuildNumber="10" Version="V2_3"
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:FindItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<m:ResponseMessages>
<m:FindItemResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:RootFolder TotalItemsInView="33" IncludesLastItemInRange="false">
<t:Items>
<t:CalendarItem>
<t:ItemId Id="AAMk" ChangeKey="DwAA" />
<t:Subject>Contoso devs team meeting</t:Subject>
<t:Start>2013-08-21T19:30:00Z</t:Start>
<t:End>2013-08-21T20:00:00Z</t:End>
</t:CalendarItem>
<t:CalendarItem>
<t:ItemId Id="AAMk" ChangeKey="DwAA" />
<t:Subject>Daily status meeting</t:Subject>
<t:Start>2013-08-21T20:00:00Z</t:Start>
<t:End>2013-08-21T21:00:00Z</t:End>
</t:CalendarItem>
<t:CalendarItem>
<t:ItemId Id="AAMk" ChangeKey="DwAA" />
<t:Subject>Lunch with sales team</t:Subject>
<t:Start>2013-08-21T21:30:00Z</t:Start>
<t:End>2013-08-21T22:30:00Z</t:End>
</t:CalendarItem>
<t:CalendarItem>
<t:ItemId Id="AAMk" ChangeKey="DwAA" />
<t:Subject>Tennis at the club</t:Subject>
<t:Start>2013-08-22T18:00:00Z</t:Start>
<t:End>2013-08-22T19:00:00Z</t:End>
</t:CalendarItem>
<t:CalendarItem>
<t:ItemId Id="AAMkA" ChangeKey="DwAA" />
<t:Subject>Online training webcast</t:Subject>
<t:Start>2013-08-22T21:00:00Z</t:Start>
<t:End>2013-08-22T22:00:00Z</t:End>
</t:CalendarItem>
</t:Items>
</m:RootFolder>
</m:FindItemResponseMessage>
</m:ResponseMessages>
</m:FindItemResponse>
</s:Body>
</s:Envelope>
定期会议和日历视图
日历文件夹与邮箱中的其他文件夹稍有不同,因为定期系列中的事件和重复序列的异常不是邮箱中的实际项目,而是作为定期主控形状的附件存储在内部。 这意味着,尽管可以使用 EWS 托管 API FindItems 重载方法之一(例如 ExchangeService.FindItems 或 EWS FindItem 操作)创建一个在一组开始值和结束值之间返回值的 EWS 请求,但 EWS 不会查看每个日历项的附件表来查找异常和匹配项。
相反,你真正想要执行的操作类似于使用 CalendarView 对象将 Dataview 应用于两个 SQL 表的联合。 请注意,出于性能原因,建议使用 PropertySet 属性通过指示要返回的约会或会议数以及所需的特定属性来限制响应的大小。