我正在使用适用于 C# 的 Microsoft Graph SDK 从 Microsoft Graph 读取数据。我还利用 Microsoft Developer Proxy 模拟 HTTP 429 状态 (TooManyRequests) 的响应以进行测试。
但是,遇到 429 状态时,SDK 的默认行为是重试请求最多 3 次。如果在第三次重试后仍然收到 429 响应,则会抛出 System.InvalidOperationException 并显示消息“执行的重试次数过多”。从代理的输出中可以明显看出此行为。
相关代码如下:
var authenticationProvider = new BaseBearerTokenAuthenticationProvider(new TokenProvider(_token));
var graphServiceClient = new GraphServiceClient(authenticationProvider);
var myTeams = await graphServiceClient
.Me
.JoinedTeams
.GetAsync(requestConfiguration => requestConfiguration.QueryParameters.Select = new string[] { "Id" });
代理的输出:
request GET https://graph.microsoft.com/v1.0/me/joinedTeams?$select=Id
chaos ╭ 429 TooManyRequests
╰ GET https://graph.microsoft.com/v1.0/me/joinedTeams?$select=Id
...
我的问题是:如何覆盖 Microsoft Graph SDK for C# 的默认行为以自行处理 429 状态代码?理想情况下,当发生这种情况时,我想调整请求率或实施其他自定义处理。
您可以将每个请求选项传递给默认的 http 中间件
var retryHandlerOption = new RetryHandlerOption
{
MaxRetry = 7,
ShouldRetry = (delay,attempt,message) => true
};
var myTeams = await graphServiceClient
.Me
.JoinedTeams
.GetAsync(requestConfiguration =>
{
requestConfiguration.QueryParameters.Select = new string[] { "Id" };
requestConfiguration.QueryParameters.Options.Add(retryHandlerOption);
});
或者用自定义实现替换默认的 RetryHandler
public class CustomRetryHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
// your code
}
}
创建 GraphServiceClient
并替换默认值
RetryHandler
var authenticationProvider = new BaseBearerTokenAuthenticationProvider(new TokenProvider(_token));
var handlers = GraphClientFactory.CreateDefaultHandlers();
// dummy replacement
var retryHandler = handlers.FirstOrDefault(x => x is RetryHandler);
var index = handlers.IndexOf(retryHandler);
handlers[index] = new CustomRetryHandler();
var httpClient = GraphClientFactory.Create(handlers);
var graphServiceClient = new GraphServiceClient(httpClient, authenticationProvider);