适用于 .NET 的 Microsoft Graph SDK 是否自动处理速率限制?
Does the Microsoft Graph SDK for .NET automatically handle rate limits?
Microsoft rate-limits 某些 Graph 端点为每 10 分钟 10,000 个请求 (source)。如果达到限制,Retry-After
header 指示在发送另一个请求之前等待多长时间。
这是由 Graph SDK 自动处理的吗?如果不是,来电者应该采取什么步骤?
我不相信 Graph C# SDK 在请求受到限制时会自动重试,但 https://github.com/venkateshchepuru/aspnet-webhooks-rest-sample/blob/87b1aa4967392096d22d382b7a8848bd9c0afeea/GraphWebhooks/Helpers/GraphHttpClient.cs 中有一个示例显示了 429 秒和 503 秒指数退避的逻辑。
此示例还遵循许多其他最佳实践 - 最大重试次数、记录请求 ID 和时间戳、指数退避等。
header后重试解析代码:
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;
}
Microsoft rate-limits 某些 Graph 端点为每 10 分钟 10,000 个请求 (source)。如果达到限制,Retry-After
header 指示在发送另一个请求之前等待多长时间。
这是由 Graph SDK 自动处理的吗?如果不是,来电者应该采取什么步骤?
我不相信 Graph C# SDK 在请求受到限制时会自动重试,但 https://github.com/venkateshchepuru/aspnet-webhooks-rest-sample/blob/87b1aa4967392096d22d382b7a8848bd9c0afeea/GraphWebhooks/Helpers/GraphHttpClient.cs 中有一个示例显示了 429 秒和 503 秒指数退避的逻辑。
此示例还遵循许多其他最佳实践 - 最大重试次数、记录请求 ID 和时间戳、指数退避等。
header后重试解析代码:
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;
}