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

tig*_*tig 14 exchange-server exchangewebservices

如果我这样做:

_calendar = (CalendarFolder)Folder.Bind(_service, WellKnownFolderName.Calendar);

var findResults = _calendar.FindAppointments(
    new CalendarView(startDate.Date, endDate.Date)
);
Run Code Online (Sandbox Code Playgroud)

我有时会发现太多物品被发现的例外情况.

"您已经超过了查找操作可以返回的最大对象数.使用分页来减小结果大小并再次尝试您的请求."

CalendarView支持一个让我指定的构造函数MaxItemsReturned,但我无法弄清楚如何再次调用它,指定offsetfor paging.ItemView有这个构造函数:

 public ItemView(int pageSize, int offset)
Run Code Online (Sandbox Code Playgroud)

这种用法很明显.

怎么样CalendarView?如何使用CalendarView?进行分页?

我可以将日期范围缩短为更短的范围,但仍无法确定它是否可以正常工作.

Ric*_*ckH 8

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)"
Run Code Online (Sandbox Code Playgroud)

不幸的是,扩展和重叠逻辑意味着你会以这种方式获得重复,每个调用至少有一个重复.

如果我必须使用CalendarView编写代码,我可能会使用MaxItemsReturned为1000(如果您未指定MaxItemsReturned,这也是将您引入错误条件的限制).如果你在一次通话中得到它们,那你就是好的.如果你必须再拨一次电话,那么你将不得不做一些额外的工作来重复删除结果集.我还试图通过在CalendarView中使用尽可能窄的日期窗口来限制服务器的负担,因为您要求Exchange计算整个时间跨度内定期约会的扩展.对于服务器来说,这可能是相当昂贵的操作.