Top
首页 > 老文章 > 正文

如何在EWS中一次性加载多个项目属性

当用户在使用EWS时,经常使用到“查找项目(Find Items)”或“查找委派项目(Find Appointments)”等查询命令。但用户会发现这两个查询命令执行后,所返回的项目属性并不完全。本文介绍了对这一问题的解决方法。
发布时间:2010-04-27 11:15        来源:        作者:肖克
【赛迪网-IT技术报道】当用户在使用Exchange Web Services (EWS)时,经常使用到“查找项目(Find Items)”或“查找委派项目(Find Appointments)”等查询命令。但用户会发现这两个查询命令执行后,所返回的项目属性并不完全。举例来说,在使用“查找项目”命令时,返回的项目属性信息中不包含Body属性信息;在执行“查找委派项目”命令时,返回的日历项目属性信息中不包含Required Attendees属性。在这种条件下,用户需要执行其他操作才能查询到项目的全部属性信息。这或许会给用户工作过程带来一些不便。 幸运的是,用户可以借用EWS管理应用程序接口(API)解决这一问题。用户可以通过在EWS中加载应用程序扩展来实现一次查询即可获得项目的所有属性信息。下面给出的一段程序代码可以实现使用指定搜索条件搜索邮箱服务器文件,并利用“加载项目属性(Load Properties For Items)”的方法,使得用户在执行“查询项目”命令后可以返回项目“主属性”及“Body属性”。 EWS扩展程序代码:
// Specify the IdOnly response shape, and specify that 
// FindItem results should be requested in batches of 25. 
ItemView view = new ItemView(25); 
view.PropertySet = new PropertySet(BasePropertySet.IdOnly); 
view.Offset = 0; 
view.OffsetBasePoint = OffsetBasePoint.Beginning; 

// Specify search criteria. 
SearchFilter searchFilter = new SearchFilter.ContainsSubstring
(ItemSchema.Subject, "Message #"); 

// Declare findResults. 
FindItemsResults<Item> findResults; 
do 
{ 
   // Call FindItems to search the Inbox folder. 
    findResults = service.FindItems(WellKnownFolderName.Inbox, searchFilter, view); 
   // Load additional properties for the current batch of items. 
    service.LoadPropertiesForItems(findResults, new PropertySet(ItemSchema.Subject,
 ItemSchema.Body)); 
    // TODO: Process the current batch of items. 
    // If more items are available, update the offset value so that the next 
    // batch of items is returned by the next call to FindItems. 
    if (findResults.NextPageOffset.HasValue) 
    { 
        view.Offset = findResults.NextPageOffset.Value; 
    } 
} 
while (findResults.MoreAvailable);
需要注意的是,在上述程序中,我们通过ItemView(25)对返回的项目数目加以参数限制。在运行“加载项目属性”程序后,返回的项目搜索结果最多为25个。鉴于服务器中的文件量过大,若不加以数量限制,返回的项目及属性信息可能会非常多。通过ItemView参数的限制,可以有效节约服务器资源,并加快用户工作处理速度。 接下来展示的是,在本例中执行“查询项目(Find Items)”操作后,在XML编辑器下呈现的搜索结果。从返回的结果中,我们可以看到邮箱服务器中共有五个项目符合搜索条件。为了方便大家阅读,在文件所处位置的表述方面这里进行了部分缩减:
<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 IndexedPagingOffset="5" TotalItemsInView="5" 
                IncludesLastItemInRange="true"> 
                    <t:Items> 
                        <t:Message> 
                            <t:ItemId Id="AAT5QA=" ChangeKey="CQAAA" /> 
                        </t:Message> 
                        <t:Message> 
                            <t:ItemId Id="AAT5QB=" ChangeKey="CQAAB" /> 
                        </t:Message> 
                        <t:Message> 
                            <t:ItemId Id="AAT5QC=" ChangeKey="CQAAC" /> 
                        </t:Message> 
                        <t:Message> 
                            <t:ItemId Id="AAT5QD=" ChangeKey="CQAAD" /> 
                        </t:Message> 
                        <t:Message> 
                           <t:ItemId Id="AAT5QE=" ChangeKey="CQAAE" />   
                        </t:Message> 
                    </t:Items> 
                </m:RootFolder> 
            </m:FindItemResponseMessage> 
        </m:ResponseMessages> 
    </m:FindItemResponse> 
</s:Body>
在这里需要提醒用户注意的是 ,在本文所叙述的例子中,匹配项目数目仅为5个,原低于ItemView参数设置的25个项目上限。所以在第一次搜索结果展示中,就已经列举出全部的匹配项目。但用户在实际应用中可能会遇到搜索匹配结果数目远大于25项的情景。在这种情景下,“查询项目”命令会多次重复执行,以每次呈现25个搜索结果的形式,返回搜索匹配项目。 下面展示的是,在本例中执行“加载项目属性(Load Properties For Items)”后,五个匹配项目的“主属性”及“Body属性”都完全展示在XML编辑器下。我们可以通过查看运行程序发现,在这个“加载项目属性”操作中,借用了“获得项目属性(Get Item)”命令:
<m:GetItem> 
    <m:ItemShape> 
        <t:BaseShape>IdOnly</t:BaseShape> 
        <t:AdditionalProperties> 
            <t:FieldURI FieldURI="item:Subject" /> 
            <t:FieldURI FieldURI="item:Body" /> 
        </t:AdditionalProperties> 
   </m:ItemShape> 
    <m:ItemIds> 
        <t:ItemId Id="AAT5QA=" ChangeKey="CQAAA" /> 
        <t:ItemId Id="AAT5QB=" ChangeKey="CQAAB" /> 
        <t:ItemId Id="AAT5QC=" ChangeKey="CQAAC" /> 
        <t:ItemId Id="AAT5QD=" ChangeKey="CQAAD" /> 
        <t:ItemId Id="AAT5QE=" ChangeKey="CQAAE" /> 
   </m:ItemIds> 
</m:GetItem>
同样的,我们也可以利用上述“加载项目属性”程序扩展“查找委派项目”命令,呈现搜索得到的日历项目所有项目属性。但这里需要注意的是,这个操作会返回一项提醒:在执行“查询委派项目”过程中,“加载项目属性”程序和IE numerable发生冲突。所以用户在执行该操作时需要找到在执行“查询委派项目”命令时,使得“加载项目属性”进程不执行IE numerable项目属性加载的方法。用户可以利用语言集成查询(Linq)解决这一问题。用户可以在EWS中加载下列程序代码,在执行“查询委派项目”时,利用“加载项目属性”程序,成功展现日历项目的RequiredAttendees属性、OptionalAttendees属性等。这里需要注意的是,我们在这段程序代码中借用“语言集成查询(Linq)”时,使用了相关System.Linq指令:
// Define search parameters and maximum number of items to return. 
CalendarView calView = new CalendarView(DateTime.Now, DateTime.Now.AddDays(3), 25); 
// Specify the IdOnly shape. 
PropertySet props = new PropertySet(BasePropertySet.IdOnly); 
calView.PropertySet = props; 
// Call FindAppointments to search the Calendar folder. 
FindItemsResults<Appointment> findResults = service.FindAppointments
(WellKnownFolderName.Calendar, calView); 

if (findResults.TotalCount > iMaxItemsReturned) 
{ 
    string sMsg = "Total number of items that match search criteria exceeds 
specified maximum number of results to return."; 
    sMsg += " To find all items that match the specified search criteria, 
either narrow the date range "; 
    sMsg += "or increase the specified maximum number of items to return in 
CalendarView."; 
    Exception e = new Exception(sMsg); 
    throw e; 
} 
else 
{ 
    // Call LoadPropertiesForItems to load the Subject, RequiredAttendees, and 
OptionalAttendees properties. 
    service.LoadPropertiesForItems(from Item item in findResults select item, 
                new PropertySet(BasePropertySet.IdOnly, 
                        AppointmentSchema.Subject, 
                        AppointmentSchema.RequiredAttendees, 
                        AppointmentSchema.OptionalAttendees)); 
}

(责任编辑:尹聪颖)

加载更多

专题访谈

合作站点
stat