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 编写代码,我可能会使用 1000 的 MaxItemsReturned(如果您不指定 MaxItemsReturned,这也是使您陷入错误状态的限制)。如果您在一个电话中获得所有信息,那您就很好。如果您必须进行第二次调用,那么您将不得不做一些额外的工作来对结果集进行重复数据删除。我还尝试通过在 CalendarView 中使用尽可能窄的日期窗口来限制服务器的负担,因为您要求 Exchange 计算整个时间跨度内定期约会的扩展。对于服务器来说,这可能是一项相当昂贵的操作。