如何解决EWS GetStreamingEvents返回访问错误
我正在使用事件通知订阅来获取有关新邮件等的通知。对于我们的一位客户,我遇到了奇怪的错误,无法解释或解决。
错误是:
Access is denied. Only the subscription owner may access the subscription.
根据文档,当订阅的已验证用户与GetEvents
请求的用户不同时,将生成此错误。在我的情况下,两个请求的授权标头完全相同。我还检查了订阅ID是否相同。
服务器为outlook.office365.com。这仅在客户的电子邮件帐户上发生。使用我们自己的电子邮件帐户,就可以了。
有人可以阐明这一点吗?谢谢。
这是订阅请求(所有xmlns
属性都已删除):
EwsRequest:
<Trace Tag="EwsRequest" Tid="53" Time="2020-10-24 22:00:52Z" Version="2.2.1.0">
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope>
<soap:Header>
<t:RequestServerVersion Version="Exchange2016" />
</soap:Header>
<soap:Body>
<m:Subscribe>
<m:StreamingSubscriptionRequest>
<t:FolderIds>
<t:DistinguishedFolderId Id="inbox">
<t:Mailbox>
<t:EmailAddress>webreg@ds.dk</t:EmailAddress>
</t:Mailbox>
</t:DistinguishedFolderId>
</t:FolderIds>
<t:EventTypes>
<t:EventType>NewMailEvent</t:EventType>
<t:EventType>DeletedEvent</t:EventType>
<t:EventType>ModifiedEvent</t:EventType>
<t:EventType>MovedEvent</t:EventType>
</t:EventTypes>
</m:StreamingSubscriptionRequest>
</m:Subscribe>
</soap:Body>
</soap:Envelope>
</Trace>
这是响应:
EwsResponse:
<Trace Tag="EwsResponse" Tid="53" Time="2020-10-24 22:00:52Z" Version="2.2.1.0">
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope >
<s:Header>
<h:ServerVersionInfo MajorVersion="15" MinorVersion="20" MajorBuildNumber="3499" MinorBuildNumber="18" Version="V2018_01_08" />
</s:Header>
<s:Body>
<m:SubscribeResponse >
<m:ResponseMessages>
<m:SubscribeResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:SubscriptionId>JwBhbTdwcjA3bWI2NjI4LmV1cnByZDA3LnByb2Qub3V0bG9vay5jb20QAAAARQChc1Q/8EqY5NixfPmIikK4REZoeNgIEAAAAKQK6CUVOJlGvS0wpw59GqM=</m:SubscriptionId>
</m:SubscribeResponseMessage>
</m:ResponseMessages>
</m:SubscribeResponse>
</s:Body>
</s:Envelope>
</Trace>
这是GetStreamingEvents
请求:
EwsRequest:
<Trace Tag="EwsRequest" Tid="53" Time="2020-10-24 22:00:52Z" Version="2.2.1.0">
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope >
<soap:Header>
<t:RequestServerVersion Version="Exchange2016" />
</soap:Header>
<soap:Body>
<m:GetStreamingEvents>
<m:SubscriptionIds>
<t:SubscriptionId>JwBhbTdwcjA3bWI2NjI4LmV1cnByZDA3LnByb2Qub3V0bG9vay5jb20QAAAARQChc1Q/8EqY5NixfPmIikK4REZoeNgIEAAAAKQK6CUVOJlGvS0wpw59GqM=</t:SubscriptionId>
</m:SubscriptionIds>
<m:ConnectionTimeout>30</m:ConnectionTimeout>
</m:GetStreamingEvents>
</soap:Body>
</soap:Envelope>
</Trace>
这是响应:
EwsResponse:
<Trace Tag="EwsResponse" Tid="13" Time="2020-10-24 22:00:52Z" Version="2.2.1.0">
<Envelope>
<soap11:Header >
<ServerVersionInfo MajorVersion="15" MinorVersion="20" MajorBuildNumber="3499" MinorBuildNumber="18" Version="V2018_01_08" />
</soap11:Header>
<soap11:Body >
<m:GetStreamingEventsResponse >
<m:ResponseMessages>
<m:GetStreamingEventsResponseMessage ResponseClass="Error">
<m:MessageText>Access is denied. Only the subscription owner may access the subscription.</m:MessageText>
<m:ResponseCode>ErrorSubscriptionAccessDenied</m:ResponseCode>
<m:DescriptiveLinkKey>0</m:DescriptiveLinkKey>
<m:ErrorSubscriptionIds>
<m:SubscriptionId>JwBhbTdwcjA3bWI2NjI4LmV1cnByZDA3LnByb2Qub3V0bG9vay5jb20QAAAARQChc1Q/8EqY5NixfPmIikK4REZoeNgIEAAAAKQK6CUVOJlGvS0wpw59GqM=</m:SubscriptionId>
</m:ErrorSubscriptionIds>
</m:GetStreamingEventsResponseMessage>
</m:ResponseMessages>
</m:GetStreamingEventsResponse>
</soap11:Body>
</Envelope>
</Trace>
解决方法
好的,我遇到了这个错误,我终于设法找到了。基本上,这是 Exchange 的一个误导性错误。
实际错误(至少在我的情况下)是我们用于连接到 Exchange 的服务帐户的请求订阅数量已达到。 Microsoft's documentation on throttling。基本上每个帐户 20 个开放订阅。似乎当您达到此限制时,订阅仍将被创建,但要么在不同的用户下以某种方式创建,要么立即被终止。 Exchange 然后返回 ErrorSubscriptionAccessDenied
错误。
解决该问题的解决方案似乎是使用服务帐户并将 ImpersonatedUserId
上的 ExchangeService
设置为您实际订阅的用户。这样,订阅计数就会与个人用户相反。我们还必须将 ExchangeService
设置为具有 X-AnchorMailbox
标头,其中包含模拟用户的 SMTP 地址。
希望这能帮助其他人免于发疯。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。