我想了解如何使用HttpClientFactory使用Polly实现乐观超时策略。
在网络上的示例中,调用异步方法以传递取消令牌时使用超时策略。但是,如果如导游所示,从配置服务中设置超时策略,如何管理取消令牌?
在示例代码中,在指南链接中,我看到了以下内容:
var timeoutPolicy = Policy.TimeoutAsync<HttpResponseMessage>(10); // Timeout for an individual try
serviceCollection.AddHttpClient("GitHub", client =>
{
client.BaseAddress = new Uri("https://api.github.com/");
client.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");
client.Timeout = TimeSpan.FromSeconds(60); // Overall timeout across all tries
})
.AddPolicyHandler(retryPolicy)
.AddPolicyHandler(timeoutPolicy);发布于 2021-12-17 08:52:40
您应该将重试和超时策略链条为组合策略。
你有两个选择:
Wrap法
.AddPolicyHandler(retryPolicy.Wrap(timeoutPolicy))timeoutPolicy是内部策略,因此它适用于每一次尝试。retryPolicy是外部策略,所以它是最重要的超时策略.AddPolicyHandler(Policy.Wrap(retryPolicy,timeoutPolicy))有序化很重要
您应该注意到,以下两种组合策略是非常不同的:
Policy.Wrap(retryPolicy,timeoutPolicy)
Policy.Wrap(timeoutPolicy, retryPolicy)通过定义全局超时,您可以避免设置HttpClient的HttpClient属性:
var localTimeoutPolicy = Policy.TimeoutAsync<HttpResponseMessage>(10);
var globalTimeoutPolicy = Policy.TimeoutAsync<HttpResponseMessage>(60);
var resilientStrategy = Policy.Wrap(globalTimeoutPolicy, retryPolicy, localTimeoutPolicy);
serviceCollection.AddHttpClient("GitHub", client =>
{
client.BaseAddress = new Uri("https://api.github.com/");
client.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");
})
.AddPolicyHandler(resilientStrategy);更新#1乐观超时
Polly的超时确实支持乐观和悲观超时。换句话说,Polly可以尝试取消那些预期到CancellationToken (乐观)的包装方法,以及那些不悲观的方法。默认情况是前者。
在乐观的情况下,您有两个选择:
await policy.ExecuteAsync(
async ct => await httpClient.SendAsync(..., ct),
CancellationToken.None);await policy.ExecuteAsync(
async ct => await httpClient.SendAsync(..., ct),
cancellationSource.Token);如果在启动期间注册了命名/类型化客户端,则只能使用第一个选项。因为policy.ExecuteAsync将代表您(隐式)调用。
如果您注册了一个类型化的客户机,并且在该客户机中定义了策略,那么您将对ExecuteAsync进行显式调用,在那里您可以决定使用哪个版本。
https://stackoverflow.com/questions/70390221
复制相似问题