如何使用 Exchange Web 服务 CalendarView 进行分页

2024-06-20

如果我这样做:

_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?如何使用 a 进行分页CalendarView?

我可以将日期范围缩小到更短的范围,但仍然无法确定它是否有效。


日历视图 http://msdn.microsoft.com/en-us/library/microsoft.exchange.webservices.data.calendarview%28v=exchg.80%29实际上并非源自分页视图 http://msdn.microsoft.com/en-us/library/microsoft.exchange.webservices.data.pagedview%28v=exchg.80%29,因此您期望的所有分页逻辑都是不可能的。 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 计算整个时间跨度内定期约会的扩展。对于服务器来说,这可能是一项相当昂贵的操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Exchange Web 服务 CalendarView 进行分页 的相关文章

随机推荐