如何使用Outlook Rest API for Exchange Online帐户并避免EWS限制?

问题描述 投票:1回答:1

我们将Outlook REST API用于具有现代Web客户端的大部分功能的应用程序,其中包括很多对话的操作,例如在文件夹中加载对话,移动和删除对话等。

当我研究我们的选项Best way to achieve Conversation view for mail folder using Outlook REST API时,我确实遇到过这个问题

似乎在可能的“会话”端点上没有开发,所以目前我们必须做很多请求以允许用户使用对话。例如,要删除对话,我们需要通过ConversationId上的过滤器(可能是相当多的)获取对话消息,然后为每条消息发出/删除端点的请求。我们确实按照建议使用批量请求,但我不确定它们是否确实使它变得更好或更差。对于一些Office365用户,我们不断收到“503:ErrorMailboxStoreUnavailable - MapiExceptionRpcServerTooBusy:”错误。

很难确切地说出错误发生的原因,因为关于如何确定应用程序的性能以及首先限制的信息非常少。

我绝对不认为我们达到了此处描述的REST API限制:(每个用户每10分钟有10000个请求)

https://blogs.msdn.microsoft.com/exchangedev/2017/04/07/throttling-coming-to-outlook-api-and-microsoft-graph/

我还检查了速率限制限制和速率限制剩余标题,它们看起来很好。

但是,同时请求似乎存在一些问题,我怀疑这可能与此处描述的限制有关:

https://msdn.microsoft.com/en-us/library/office/jj945066(v=exchg.150).aspx

我不是交易所的专家,因此我很难确定问题所在。另外,我找不到有关其余API限制与Exchange限制之间关系的信息。例如,每次20个请求的2个批量请求是否可以打破此限制:EWSMaxConcurrency(根据文档,在线excel为27个)

看看我们的日志,我的第一个猜测是那些与会话相关的请求太贪心了。

我们可以遵循哪些指导方针来解决这种情况吗?

我将在这里粘贴错误以防万一。谢谢!

503. {"error":{"code":"ErrorMailboxStoreUnavailable","message":"The mailbox database is temporarily unavailable., MapiExceptionRpcServerTooBusy: Unable to get properties on object. (hr=0x80004005, ec=2419)
Diagnostic context:
    ......
    Lid: 64625   StoreEc: 0x97F     
    Lid: 52788  
    Lid: 55847   EMSMDBPOOL.EcPoolSessionDoRpc called [length=117]
    Lid: 43559   EMSMDBPOOL.EcPoolSessionDoRpc returned [ec=0x97F][length=522][latency=1015]
    Lid: 32881   StoreEc: 0x97F     
    Lid: 50035  
    Lid: 64625   StoreEc: 0x97F     
    Lid: 52788  
    Lid: 55847   EMSMDBPOOL.EcPoolSessionDoRpc called [length=117]
    Lid: 43559   EMSMDBPOOL.EcPoolSessionDoRpc returned [ec=0x97F][length=522][latency=1000]
    Lid: 32881   StoreEc: 0x97F     
    Lid: 50035  
    Lid: 64625   StoreEc: 0x97F     
    Lid: 52788  
    Lid: 55847   EMSMDBPOOL.EcPoolSessionDoRpc called [length=117]
    Lid: 43559   EMSMDBPOOL.EcPoolSessionDoRpc returned [ec=0x97F][length=522][latency=1015]
    Lid: 32881   StoreEc: 0x97F     
    Lid: 50035  
    Lid: 64625   StoreEc: 0x97F     
    Lid: 52788  
    Lid: 55847   EMSMDBPOOL.EcPoolSessionDoRpc called [length=117]
    Lid: 43559   EMSMDBPOOL.EcPoolSessionDoRpc returned [ec=0x97F][length=522][latency=1015]
    Lid: 32881   StoreEc: 0x97F     
    Lid: 50035  
    Lid: 64625   StoreEc: 0x97F     
    Lid: 63028  
    Lid: 52176   ClientVersion: 15.20.527.7
    Lid: 50032   ServerVersion: 15.20.527.6000
    Lid: 50128  
    Lid: 1494    ---- Remote Context Beg ----
    Lid: 48506   StoreEc: 0x80040401
    Lid: 32796   StoreEc: 0x80040401
    Lid: 43632   StoreEc: 0x80040401
    Lid: 61692   StoreEc: 0x80040401
    Lid: 34356   StoreEc: 0x97F     
    Lid: 1750    ---- Remote Context End ----
    Lid: 1494    ---- Remote Context Beg ----
    Lid: 48506   StoreEc: 0x80040401
    Lid: 32796   StoreEc: 0x80040401
    Lid: 43632   StoreEc: 0x80040401
    Lid: 61692   StoreEc: 0x80040401
    Lid: 34356   StoreEc: 0x97F     
    Lid: 1750    ---- Remote Context End ----
    Lid: 50288  
    Lid: 23354   StoreEc: 0x973     
    Lid: 35180  
    Lid: 25913  
    Lid: 21817   ROP Failure: 0x973     
    Lid: 20385  
    Lid: 28577   StoreEc: 0x973     
    Lid: 32001  
    Lid: 29953   StoreEc: 0x973     
    Lid: 32768  
    Lid: 33024   StoreEc: 0x973     "}
office365api outlook-restapi
1个回答
0
投票

不知道这会有多大帮助,但FWIW。我曾一次就批处理操作及其对节流的影响问了一个类似的问题,并从在该领域工作的其中一个PM得到了回答:

无论是批量API调用还是单个API调用,我们都决定根据它消耗的服务资源来限制或不限制,而不是调用#。因此,我们不会惩罚用于批量处理API请求的应用程序。例如,如果5个API调用需要20个单位的服务资源,并且您使用5个API进行批量调用,我们会将其视为相同的,即20个服务资源单元。在这个例子中,我忽略了处理批处理请求和处理5个单独请求的开销之间的差异。实际上,批量请求比5个单独的请求便宜一点。

© www.soinside.com 2019 - 2024. All rights reserved.