假设以下设置为 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)
无论如何它仍然使用默认值。
我已经无计可施了。您可能认为这很简单并且有记录,但我在搜索中找不到任何内容。
谢谢!
据我所知,你无法实现你想要实现的目标。
每当您拨打
AddStandardResilienceHandler
或 AddResilienceHandler
时,它都会注册一个全新的 ResilienceHandler
。该类目前被视为“内部”。 (因此,多次调用它会注册多个 ResilienceHandler
实例。)您可能会想通过 -standard
检索
AddStandardResilienceHandler
管道本身(这是由 ResiliencePipelineProvider<string>
调用注册的管道的名称)。问题是检索到的ResiliencePipeline
无法直接调整。它只支持 reload但这也不会帮助你...... 总而言之,目前不支持此用例。我建议在 https://github.com/dotnet/extensions/issues