如何为特定客户端重写 AddStandardREsilenceHandler() ?

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

假设以下设置为 C# 项目中所有客户端的默认设置:

builder.Services.ConfigureHttpClientDefaults(http => {
    // Turn on resilience by default
    http.AddStandardResilienceHandler();

});

如何覆盖特定客户端的 StandardResilienceHandler 的值?

我尝试了以下变体:

    services.AddHttpClient<IMyClient, MyClient>()           
        .AddResilienceHandler("MyClient", (context, next) => {
            context.AddTimeout(TimeSpan.FromMinutes(10));
        });

被忽略

.AddStandardResilienceHandler(options => {
                options.AttemptTimeout = new HttpTimeoutStrategyOptions {
                    Timeout = TimeSpan.FromMinutes(5)
                };
                options.TotalRequestTimeout = new HttpTimeoutStrategyOptions {
                    Timeout = TimeSpan.FromMinutes(15)
                };
                options.CircuitBreaker.SamplingDuration = TimeSpan.FromMinutes(10);
            });

也被忽略了。

我还创建了这样的政策:

var retryPolicy = HttpPolicyExtensions

                    .HandleTransientHttpError()
                    .WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)))
                    .WrapAsync(Policy.TimeoutAsync<HttpResponseMessage>(
                        TimeSpan.FromMinutes(5),
                        TimeoutStrategy.Optimistic));

然后使用这个:

.AddPolicyHandler(retryPolicy)

无论如何它仍然使用默认值。

我已经无计可施了。您可能认为这很简单并且有记录,但我在搜索中找不到任何内容。

谢谢!

c# asp.net-core dotnet-httpclient polly
1个回答
0
投票

据我所知,你无法实现你想要实现的目标。

每当您拨打

AddStandardResilienceHandler
AddResilienceHandler
时,它都会注册一个全新的
ResilienceHandler
。该类目前被视为“内部”。 (因此,多次调用它会注册多个 ResilienceHandler 实例。)
您可能会想通过 

-standard

检索

AddStandardResilienceHandler
管道本身(这是由
ResiliencePipelineProvider<string>
调用
注册的管道的名称)。问题是检索到的
ResiliencePipeline
无法直接调整。它只支持
reload
但这也不会帮助你...... 总而言之,目前不支持此用例。我建议在

https://github.com/dotnet/extensions/issues

存储库上提交问题。

© www.soinside.com 2019 - 2024. All rights reserved.