0

我正在尝试克服使用 Microsoft Graph SDK 上传/更新 SharePoint 文档库中文件的元数据时发生的间歇性 409 错误。要重试失败的调用,SDK 提供了 WithMaxRetry() 和 WithShouldRetry() 选项。MaxRetry 适用于错误代码 429,我假设 ShouldRetry 委托为我们提供了一个选项来实现我们自己的重试逻辑。基于这个假设,我有以下代码:

_graphServiceClientFactory.GetClient().Drives[driveId].Root.ItemWithPath(path).ListItem.Fields.Request()
                       .WithShouldRetry((delay, attempt, httpResponse) =>
                        (attempt <= 5 &&
                        (httpResponse.StatusCode == HttpStatusCode.Conflict)))
                       .UpdateAsync(new FieldValueSet { AdditionalData = dataDictionary }); 

在我的测试中,ShouldRetry 委托从未被调用/评估失败/否则,没有关于 WithShouldRetry() 用法的文档。获取有关使用 WithShouldRetry() 选项的输入会很有帮助。

4

1 回答 1

0

看来 WithShouldRetry() 有问题,我已在 GitHub(Microsft Graph SDK repo)中报告了此问题,他们已将问题标记为Bug

作为一种解决方法,可以使用 Polly 进行重试,如下所示,

var result = await Policy.Handle<ServiceException>(ex =>
                   ex.StatusCode == HttpStatusCode.Conflict ||
                   ex.StatusCode == HttpStatusCode.Locked ||
                   ex.StatusCode == HttpStatusCode.ServiceUnavailable ||
                    ex.StatusCode == HttpStatusCode.GatewayTimeout ||
                    ex.StatusCode == HttpStatusCode.TooManyRequests)
                    .Or<HttpRequestException>()
                   .WaitAndRetryAsync(3, retryCount => TimeSpan.FromSeconds(Math.Pow(2, retryCount) / 2))
                   .ExecuteAsync<FieldValueSet>(async () =>
                   await GetDriveItemWithPath(itemPath, driveId).ListItem.Fields.Request()
                   .WithMaxRetry(0)
                       .UpdateAsync(new FieldValueSet { AdditionalData = dataDictionary }));

默认情况下,Graph SDK 对节流和网关超时错误进行 3 次重试。在上面的代码中,那些本机重试已通过调用 WithMaxRetry(0) 被阻止。Graph SDK 的内部重试逻辑是 Polly 实现的一部分。

注意:这个 Polly 实现应该是一个临时解决方案,我相信一旦报告的错误得到解决,最好使用 WithShouldRetry()。

于 2021-01-14T12:30:48.107 回答