如果我这样做:
_calendar = (CalendarFolder)Folder.Bind(_service, WellKnownFolderName.Calendar);
var findResults = _calendar.FindAppointments(
new CalendarView(startDate.Date, endDate.Date)
);
我有时会发现一个例外,那就是发现了太多的物品。
“您已经超出了查找操作可以返回的最大对象数量。使用分页减少结果大小,然后重试您的请求。”
CalendarView
支持一个允许我指定MaxItemsReturned
的构造函数,但我无法弄清楚如何指定offset
进行分页再次调用它。 ItemView
具有此构造函数: public ItemView(int pageSize, int offset)
而且这种用法很明显。
那
CalendarView
呢?如何使用CalendarView
进行分页?我可以将日期范围缩小到较短的范围,但是仍然无法确定日期范围是否可以正常使用。
最佳答案
CalendarView实际上不是从PagedView派生的,因此不可能实现您期望的所有分页逻辑。 MaxItemsReturned的上限大于页面大小。返回的错误与PagedView派生的视图类型更相关。
我使用了一些PowerShell,通过根据返回的最后一项滚动CalendarView窗口来模拟分页,但是不幸的是,CalendarView和Appointment扩展背后的逻辑使得无法准确获得所需的内容。基本上,随着扩展的进行,它会在“ N”个项目处停止,但是您可能有多个约会恰好在同一时间开始,并且可能会给您一个约会,但其余的不会。另外,与窗口重叠的所有约会都将包括在内,因此,如果日历上有50个约会且开始时间都相同,则下面的代码将陷入无限循环。
Add-Type -Path "C:\Program Files\Microsoft\Exchange\Web Services\1.2\Microsoft.Exchange.WebServices.dll"
$service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService
$cred = New-Object Microsoft.Exchange.WebServices.Data.WebCredentials ($user , $passwd)
$service.UseDefaultCredentials = $false
$service.Credentials = $cred
$service.AutodiscoverUrl($user)
$num=50
$total=0
$propsetfc = [Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties
$calfolder = [Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Calendar
$service.UserAgent = "EWSCalViewTest"
$calview = New-Object Microsoft.Exchange.WebServices.Data.CalendarView("1/1/2012","12/31/2012", $num)
$calview.PropertySet = $propsetfc
do {
$findresults = $service.FindAppointments($calfolder,$calview)
write-host "Found:" $findresults.Items.Count "of" $findresults.TotalCount
$calview.StartDate = $findresults.Items[$findresults.Items.Count-1].Start
$total+=$findresults.Items.Count
} while($findresults.MoreAvailable)
write-host $total "total found (including dups)"
不幸的是,扩展和重叠逻辑意味着您将以这种方式获得重复项,每次调用之后至少要重复一次。
如果必须使用CalendarView编写代码,则可能会使用MaxItemsReturned为1000(如果未指定MaxItemsReturned,这也是使您陷入错误状况的限制)。如果一口气把它们都搞定,那就太好了。如果您必须打第二个电话,那么您将不得不做一些额外的工作来简化结果集。我还尝试通过在CalendarView中使用尽可能窄的日期窗口来限制服务器的负担,因为您要让Exchange计算整个时间跨度中定期约会的扩展。对于服务器而言,这可能是一个相当昂贵的操作。
关于exchange-server - 如何使用Exchange Web Services CalendarView进行分页,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11999781/