.NET的Microsoft Graph SDK是否自动处理速率限制?

时间:2018-09-21 15:52:42

标签: c# azure-active-directory microsoft-graph microsoft-graph-sdks

Microsoft将某些Graph端点的速率限制为每10分钟10,000个请求(source)。如果达到限制,则Retry-After标头指示发送另一个请求之前要等待多长时间。

这是Graph SDK自动处理的吗?如果没有,呼叫者应该采取什么步骤?

1 个答案:

答案 0 :(得分:4)

我不认为Graph C#SDK在请求受限制时会自动重试,但是https://github.com/venkateshchepuru/aspnet-webhooks-rest-sample/blob/87b1aa4967392096d22d382b7a8848bd9c0afeea/GraphWebhooks/Helpers/GraphHttpClient.cs处有一个示例显示了429s和503s的指数退避逻辑。

此示例还遵循其他一些最佳做法-最大重试次数,日志记录请求ID和时间戳,指数补偿等。

解析标头后重试的代码:

private TimeSpan GetServerRecommendedPause(HttpResponseMessage response)
    {
        var retryAfter = response?.Headers?.RetryAfter;
        if (retryAfter == null)
            return TimeSpan.Zero;

        return retryAfter.Date.HasValue
            ? retryAfter.Date.Value - DateTime.UtcNow
            : retryAfter.Delta.GetValueOrDefault(TimeSpan.Zero);
    }

确定使用重试后标头或指数补偿的代码:

if (((int)response.StatusCode == 429) || ((int)response.StatusCode == 503))
            {
                // Retry Only After the server specified time period obtained from the response.
                TimeSpan pauseDuration = TimeSpan.FromSeconds(Math.Pow(2, attempt));
                TimeSpan serverRecommendedPauseDuration = GetServerRecommendedPause(response);
                if (serverRecommendedPauseDuration > pauseDuration)
                {
                    pauseDuration = serverRecommendedPauseDuration;
                }