我已经使用以下代码配置了Polly IAsyncPolicy:

IAsyncPolicy retryPolicy = Policy
    .Handle<HttpRequestException>(e => !e.IsBadRequest())
    .WaitAndRetryAsync(
        Backoff.DecorrelatedJitterBackoffV2("00:00:01", 5),
        onRetry: (response, timeSpan, retryCount, context) =>
    {
        if (!context.TryGetLogger(out var logger))
        {
            return;
        }

        logger.LogWarning($"Retrying call {retryCount} with timespan: {timeSpan} due to: {response.Message}");
    });

它作为Singleton注入到类中,并以以下方式使用:

var context = new Context($"API-call-{Guid.NewGuid()}", new Dictionary<string, object>
{
    { "logger", _logger },
});

await _resiliencePolicy.ExecuteAsync(async ctx => await _apiClient.Post.Delete(2), _context);

问题发生在进行重试时,原始URL https://someurl.com/post/2现在变成https://someurl.com/post/22(重复两次),并且每次重试都会继续发生这种情况.比方说,第10次重试的URL为https://someurl.com/post/222222222

任何 idea 都将受到极大的赞赏.

推荐答案

根据定义,重试re-executes所提供的用户委托/用户回调.这意味着它不会代表您更改请求的任何内容.

例如,如果您想要在HttpClient请求的情况下更改请求URL,那么您必须编写一段代码,每次重试策略调用用户委托时获取新的URL.你可以找到一个例子.

因此,_apiClient.Post.Delete(2)suspectedly的工作方式是将所提供的号码附加到所存储的请求URL的末尾.

有些代码如下所示(伪代码):

this.RequestUrl = $"{this.RequestUrl}{deleteParameter}";

为了修正(if you can change the underlying code),您必须将数字附加到基本url以构造请求url(伪代码):

this.RequestUrl = $"{this.BaseUrl}{deleteParameter}";

Csharp相关问答推荐

C#类主构造函数中的调试参数

CsWin32如何创建PWSTR的实例,例如GetWindowText

读取配置文件(mytest. exe. config)

Entity Framework Core 8 dbcontext—无法以多对多关系添加某些行'

如何在C#中使用正则表达式抓取用逗号分隔的两个单词?

Blazor EventCallback<;MyType<;T>;>;

如何在没有前缀和可选后缀的情况下获取Razor Page Handler方法名称?

C#无法让WinForm进度条生成动画错误跨线程操作无效

为什么Regex.IsMatch(";\\t";,";\\t";)返回FALSE而不是TRUE?

如何捕获对ASP.NET核心应用程序的所有请求并将其发送到一个页面

使用System.Text.Json进行序列化时发生StackOverflow异常

在集成测试中可以在模拟InMemory数据库中设定数据种子

如何在一次数据库调用中为ASP.NET核心身份用户加载角色

无法向Unity注册Microsoft Logger

Xamarin中出错.表单:应用程序的分部声明不能指定不同的基类

项目参考和方法签名问题

在使用.NET EF Core DbContext属性之前,是否应使用null判断

如果所有";async任务方法()";调用都返回Task.FromResult()-是否同步执行?

C#-如何将int引用获取到byte[]

组件';EditForm';使用与包含子内容元素';授权';相同的参数名称(';上下文';)