EWS API-重新创建通知订阅时出错

在处理 Office365日历文件夹的拉订阅时,我在 SendNotification请求中收到了很多 ErrorReadEventsFailed消息。此错误实质上意味着不再能够找到订阅,服务器不应该再期待新的通知。

选中 Microsoft 推荐的错误处理,解决方案是使用自动发现重新发现 ExternalEwsUrl 或 EwsPartnerUrl,并创建一个新订阅。

对于 Office365,使用 OAuth2服务帐户的组合,AutoDiscovery 服务似乎几乎不可能,因此我一直使用 https://outlook.office365.com/EWS/Exchange.asmx作为主要的 EWS 端点。

但是,当我尝试为特定的日历文件夹创建一个新的订阅时,我总是得到一个通用的 500 ErrorNoRespondingCASInDestinationSite错误:

ExchangeWeb 服务当前不可用于此请求,因为目标站点中的客户端访问服务器都无法处理此请求。

奇怪的部分是 这只有在接收到初始 ErrorReadEventsFailed错误后才会直接发生。如果我在30秒内再次尝试,请求就会顺利通过。

在做了一些研究之后,似乎大多数用户发现确保为服务帐户希望模拟的用户正确设置 X-AnchorMailbox头是有帮助的。我反复检查了这个头,它确实是沿着重新订阅请求发送的。

这个问题可以通过指数后退解决方案来解决,或者只是重试 X 次,直到请求通过。在我看来,当订阅“丢失”时,O365服务需要时间来更改 Exchange 服务器的 DNS (这是我唯一能想到的)。

任何帮助都将不胜感激!

2572 次浏览

根据以下文档: https://msdn.microsoft.com/en-us/library/office/dn458788(v=exchg.150).aspx

当订阅丢失或不再可访问时,最好创建一个新的订阅,并且在新订阅中不包括旧的水印。使用旧的水印重新注册会导致对事件进行线性扫描,这是代价高昂的。

相反,应创建一个新订阅并比较文件夹属性,以查找丢失的订阅和新订阅之间发生的内容更改。我们建议您检查的扩展文件夹属性是 PR_LOCAL_COMMIT_TIME_MAX (0x670a0040)PR_DELETED_COUNT_TOTAL (0x670b0003)

可以通过创建扩展属性定义来实现这一点。 我觉得这个能帮到你!