使用 Microsoft Graph SDK C# 5.2x 处理限制错误

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

我正在使用适用于 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 状态代码?理想情况下,当发生这种情况时,我想调整请求率或实施其他自定义处理。

microsoft-graph-sdks throttling
1个回答
0
投票

您可以将每个请求选项传递给默认的 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);
    
© www.soinside.com 2019 - 2024. All rights reserved.