Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Exchange server 如何使用Exchange Web服务日历视图进行分页_Exchange Server_Exchangewebservices - Fatal编程技术网

Exchange server 如何使用Exchange Web服务日历视图进行分页

Exchange server 如何使用Exchange Web服务日历视图进行分页,exchange-server,exchangewebservices,Exchange Server,Exchangewebservices,如果我这样做: _calendar = (CalendarFolder)Folder.Bind(_service, WellKnownFolderName.Calendar); var findResults = _calendar.FindAppointments( new CalendarView(startDate.Date, endDate.Date) ); 我有时会遇到一个例外,发现的物品太多了 “您已超过查找操作可返回的最大对象数。请使用分页减少结果大小,然后重试请求。”

如果我这样做:

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

var findResults = _calendar.FindAppointments(
    new CalendarView(startDate.Date, endDate.Date)
);
我有时会遇到一个例外,发现的物品太多了

“您已超过查找操作可返回的最大对象数。请使用分页减少结果大小,然后重试请求。”

CalendarView
支持一个构造函数,可以让我指定
MaxItemsReturned
,但我不知道如何再次调用它,为分页指定
偏移量
ItemView
具有此构造函数:

 public ItemView(int pageSize, int offset)
这种用法是显而易见的

那日历视图呢?如何使用
日历视图进行分页

我可以将日期范围缩短为一个较短的范围,但仍然无法确定它是否会工作。

实际上不是从中派生出来的,因此您所期望的所有分页逻辑都是不可能的。MaxItemsReturn的上限大于页面大小。返回的错误与PagedView派生的视图类型更相关

我使用了一些PowerShell来模拟分页,根据返回的最后一个项目滚动CalendarView窗口,但不幸的是,CalendarView和约会扩展背后的逻辑使您无法获得所需的内容。基本上,当它进行扩展时,它将在“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编写代码,我可能会使用MaxItemsReturn 1000(如果不指定MaxItemsReturn,这也是将您带入错误状态的限制)。如果你在一个电话里把他们都接过来,你就很好了。如果必须进行第二次调用,则必须进行一些额外的工作来消除结果集的重复数据。我还尝试通过在CalendarView中使用尽可能窄的日期窗口来限制服务器的负担,因为您要求Exchange计算整个时间跨度内定期约会的扩展。对于服务器来说,这可能是一个相当昂贵的操作。

您可以使用
ItemView
SearchFilter
来查询约会:

var itemView=newitemview(100,0);
itemView.PropertySet=新的PropertySet(BasePropertySet.IdOnly,
ItemSchema.Subject,AppointSchema.Start,AppointSchema.End);
var filter=新的SearchFilter.SearchFilterCollection(LogicalOperator.And,
新的SearchFilter.IsEqualTo(ItemSchema.ItemClass,“IPM.Appointment”),
新的SearchFilter.IsGreater大于或等于(AppointSchema.Start,startDate),
新的SearchFilter.IsLessThan(AppointmentSchema.Start,endDate));
bool-moreavable=true;
while(更多可用)
{
var result=_service.FindItems(WellKnownFolderName.Calendar、filter、itemView);
foreach(类型()的结果中的var约会)
{
DateTime start=约会。开始;
日期时间结束=约会。结束;
字符串subject=appointment.subject;
// ...
}
itemView.Offset+=itemView.PageSize;
moreAvailable=result.moreAvailable;
}

您仍然可以对FindAppoints函数进行分页,以操作CalendarView开始日期

var cal = CalendarFolder.Bind(_service, WellKnownFolderName.Calendar);
var cv = new CalendarView(start, end, 1000);

var appointments = new List<Appointment>();

var result = cal.FindAppointments(cv);

appointments.AddRange(result);

while (result.MoreAvailable)
{
     cv.StartDate = appointments.Last().Start;

     result = cal.FindAppointments(cv);

     appointments.AddRange(result);
}
var-cal=CalendarFolder.Bind(_服务,WellKnownFolderName.Calendar);
var cv=新日历视图(开始、结束、1000);
var约会=新列表();
var结果=校准FindApoints(cv);
任命范围(结果);
while(result.moreavable)
{
cv.StartDate=appointments.Last().Start;
结果=校准点(cv);
任命范围(结果);
}

虽然我不知道他们是否按顺序来。如果他们不这样做,你可能不得不使用上一个envent开始日期并删除重复项。

好东西RickH,但对我来说仍然不够确定。在此期间,我所做的是将跨度分为几个月,并对每个月使用
CalendarView
。似乎工作正常。“服务器处理成本”基本上是相同的,无论我是全年还是12个月的长期使用,不是吗?即使您的回答并不能真正解决我的问题,您也提供了一个答案:不可能使用日历进行PagedView样式的分页。因此,将此标记为答案。对于逐月分割,如果您有跨越月边界的约会,您将获得这些约会的副本。如果您需要一整年的时间,我想说这两个选项大致相当于12个单独的呼叫,由于单独呼叫的额外开销,使用的资源稍微多一些,以及执行12个较小的扩展缓存查找/扩展。如果日历上同时开始的约会超过了
maxitemsreen
,它将陷入一个无限循环。这并不会扩大重复出现的母版,因此就我所知,它提供了日历的不完整视图。这就是为什么
日历视图
非常有用的原因(除了页面不好)