使用对Office365日历文件夹的订阅时,我ErrorReadEventsFailed在SendNotification请求中收到了很多消息.此错误实质上意味着无法再找到订阅,并且服务器不再需要新通知.
检查Microsoft建议的错误处理,解决方案是使用自动发现重新发现ExternalEwsUrl或EwsPartnerUrl,并创建新订阅.
使用Office365,通过OAuth2服务帐户的组合,AutoDiscovery服务似乎几乎不可能,因此我一直将其https://outlook.office365.com/EWS/Exchange.asmx用作主要的EWS端点.
但是,当我尝试为特定日历文件夹创建新订阅时,我不断收到一般500 ErrorNoRespondingCASInDestinationSite错误:
Exchange Web服务当前不可用于此请求,因为目标站点中的任何客户端访问服务器都无法处理该请求.
奇怪的是这只是在收到初始ErrorReadEventsFailed错误后直接发生的.如果我再试一次,比如30秒,请求就会顺利通过.
在做了一些研究之后,似乎大多数用户发现确保X-AnchorMailbox为服务帐户希望模拟的用户正确设置标题是有帮助的.我仔细检查了这个标题,确实是按照重新订阅的请求发送的.
这个问题可以通过指数退避解决方案解决,或者只是重试X次,直到请求通过.在我看来,当订阅"丢失"时,O365服务需要时间来更改Exchange服务器的DNS(这是我唯一能想到的).
任何帮助将不胜感激!
使用Exchange 推送通知我一直在创建一个同步来自Office365用户的日历数据的服务.我一直在使用Office365 Calendar REST API(用于获取和管理日历)和EWS API(用于订阅日历更改)的组合.
我注意到最近MS已经为他们的订阅端点引入了预览API.但是,此API仍处于预览模式,我希望暂时不使用它.
一旦我完成了所有设置,问题是我无法在日历事件资源(REST)和推送通知上返回的EWS CalendarItem资源之间建立关联.在ItemId为CalendarItem和Id对REST事件不同.
当尝试更新我从REST API保存的事件时,这证明是有问题的,因为我找不到将两者关联起来的好方法.
任何帮助是极大的赞赏!
编辑
在进一步挖掘之后,我实际上发现从REST API(GET /calendars)返回的日历似乎是MessageEWS层次结构中的项目.因此,不是此端点返回实际的文件夹ID,而是返回属于某个名为"公共视图"的文件夹中的项ID.
我不确定为什么事情是这样设计的,但base64编码ID的差异似乎非常小.我仍然无法弄清楚将两者联系起来的好方法.
我正在尝试构建一个可以访问组织的所有日历(用户,房间等)的应用程序.
目前,我的身份验证流程将代表租户用户登录,并使用刷新令牌来访问所需的资源.我一提出要求:
https://outlook.office365.com/api/v1.0/users/{room-resource@email}/events
Run Code Online (Sandbox Code Playgroud)
我的申请回复了 401
从我的收集来看,似乎这个流程仅限于单个用户的范围.虽然租户管理员应该有权查看任何房间资源,但该房间在技术上是用户本身,因此API将以禁止的错误进行响应.现在似乎正确的流程是租户管理员必须使用新的服务OAuth流授予我的应用程序权限.
通过阅读这篇文章,似乎API正在使用OAuth 客户端凭据授权类型(仅限应用程序令牌).而不是使用/oauth/common端点我现在必须使用/oauth/tenant-id我可以通过code+id_token响应类型中返回的JWT令牌检索.这导致了我的第一个问题:
使用OpenID流程是最初检索租户ID的唯一方法吗?
接下来是对我来说有点模糊的地方.
我们现在必须生成X.509 SSL证书并将指纹/值上传到我们的Azure应用程序清单.很容易.
然后根据Office 365 Rest API中的讨论- 守护进程周认证,我们构建一个特定的JWT,base64对其进行编码,并使用我们的证书进行签名.
我实际上没有完成最后几步,但我会在可以的时候发布我的结果.我只是确保我似乎正在遵循正在尝试访问的资源的正确程序.我知道服务令牌是一个相当新的功能,不幸的是我必须找到在Stackoverflow上发送已签名的JWT的流程,而不是官方的MSFT文档......
我还注意到,由于我们正在使用客户端凭据流,因此我们不会refresh_token在响应中收到.对于我的最后一个问题:
当访问不同的资源(即Graph API/Office365 API)时,我是否只使用签名请求为每个资源获取不同的访问令牌,而不是使用刷新令牌来获取多个资源?
如果我似乎正在进行的总体方向是正确的,请告诉我!任何帮助是极大的赞赏.