这是我用于检索日历项的SOAP FindItem调用:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:typ="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:mes="http://schemas.microsoft.com/exchange/services/2006/messages">
<soapenv:Header>
<typ:RequestServerVersion Version="Exchange2007_SP1"/>
<typ:MailboxCulture>en-US</typ:MailboxCulture>
<typ:TimeZoneContext>
<typ:TimeZoneDefinition Id="W. Europe Standard Time"/>
</typ:TimeZoneContext>
</soapenv:Header>
<soapenv:Body>
<mes:FindItem Traversal="Shallow">
<mes:ItemShape>
<typ:BaseShape>AllProperties</typ:BaseShape>
<typ:AdditionalProperties>
<typ:FieldURI FieldURI="item:LastModifiedTime" />
</typ:AdditionalProperties>
</mes:ItemShape>
<mes:CalendarView MaxEntriesReturned="1000" StartDate="2015-02-18T00:00:00Z" EndDate="2015-12-05T23:59:59Z"/>
<mes:ParentFolderIds>
<typ:DistinguishedFolderId Id="calendar">
<typ:Mailbox>
<typ:EmailAddress>sddress@server.nl</typ:EmailAddress>
</typ:Mailbox>
</typ:DistinguishedFolderId>
</mes:ParentFolderIds>
</mes:FindItem>
</soapenv:Body>
</soapenv:Envelope>
可选元素
中的MaxEntriesReturned <mes:CalendarView MaxEntriesReturned="1000" StartDate="2015-02-18T00:00:00Z" EndDate="2015-12-05T23:59:59Z"/>
应该是the maximum number of results to return in the FindItem response
然而:
1)结果很容易返回更多项目:
<m:FindItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<m:ResponseMessages>
<m:FindItemResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:RootFolder TotalItemsInView="2516" IncludesLastItemInRange="false">
<t:Items>
<t:CalendarItem>
(并注意IncludesLastItemInRange="false"
,所以还有更多项目。那么为什么要返回2516?)
2)如果我将MaxEntriesReturned="1000"
从查询中删除,我会收到带有文本的ErrorServerBusy
响应代码。服务器现在无法为此请求提供服务。稍后再试。
这可能与Exchange Server throttling policies有关,但该链接表示:
EWSFindCountLimit参数指定此当前进程中此用户可同时存在于客户端访问服务器内存中的FindItem或FindFolder调用的最大结果大小
因此我希望获得带有文本的ErrorExceededFindCountLimit
响应代码您已超过了可以为查找操作返回的最大对象数。使用分页来缩小结果大小并再次尝试您的请求。
我对这些观察所遇到的问题:
1)我指定MaxEntriesReturned
以防止被数据淹没,但我得到的远远超过我的要求。 (冰淇淋很好,但不是这里)。
2)如果我确实遇到了限制政策,我想要一个体面的ErrorExceededFindCountLimit
回复告诉我发生了什么,以便我的代码可以提出纠正措施; ErrorServerBusy
可能意味着许多事情。
两者可以做些什么?
这是针对发布到制造(RTM)version of Exchange Server 2013的所有测试:
<ServerVersionInfo MajorVersion="15" MinorVersion="0" MajorBuildNumber="516" MinorBuildNumber="29" Version="Exchange2013" .../>
答案 0 :(得分:2)
Flume Source - SpoolDir or similar -> Channel -> AvroSink (SparkStreaming)
响应中的TotalItemsInView
属性对应于整个CalendarView中的总项数。如果您查看实际返回的项目数量,结果数据集仍将受集合FindItem
的约束。
因此,举例来说,如果我将MaxEntriesReturned
设置为1来表示日期范围,我知道总共有4个事件,我会回来:MaxEntriesReturned
。但在回复中,只返回一个<m:RootFolder TotalItemsInView="4" IncludesLastItemInRange="false”>
。
[由OP添加的注释]解决了问题(item 2 is in this answer)
的第1项答案 1 :(得分:1)
不满足于等待答案,我一直在挖掘并遇到Throttling Policies and the EWSFindCountLimit。
这解释了问题2)(item 1 is in this answer)
文章说如果调用的RequestServerVersion早于Exchange2010,您将收到错误代码为ErrorServerBusy的失败响应。
这正是我在做的事情:<typ:RequestServerVersion Version="Exchange2007_SP1"/>
。将其更改为<typ:RequestServerVersion Version="Exchange2010"/>
会返回:
<m:FindItemResponseMessage ResponseClass="Error">
<m:MessageText>You have exceeded the maximum number of objects that can be returned for the find operation. Use paging to reduce the result size and try your request again.</m:MessageText>
<m:ResponseCode>ErrorExceededFindCountLimit</m:ResponseCode>
<m:DescriptiveLinkKey>0</m:DescriptiveLinkKey>
<m:MessageXml>
<t:Value Name="PolicyLimit">1000</t:Value>
</m:MessageXml>
</m:FindItemResponseMessage>
...很好地告诉我,我打破的限制是1000。
文章的结论是:故事的寓意是:在调用FindItem或FindFolder时总是使用分页机制
答案 2 :(得分:1)
CalenderView不可分页,例如查看https://msdn.microsoft.com/en-us/library/microsoft.exchange.webservices.data.calendarview_properties(v=exchg.80).aspx,您将看到没有允许您指定偏移(或索引)值的属性。
您需要做的是缩短时间窗口,以便获得少于1000件物品。然后自己手动翻页时间窗口,以获得所需的完整约会列表。
干杯 格伦