如何在 RetryPolicy<HttpResponseMessage> 上使用策略包装?
How to use policy wrap on RetryPolicy<HttpResponseMessage>?
我有以下使用 Polly.Extensions.Http
的重试策略:
var retryPolicy = Policy.Handle<BrokenCircuitException>().OrTransientHttpError().WaitAndRetryAsync
(
retryCount: maxRetryCount,
sleepDurationProvider: attempt => TimeSpan.FromSeconds(Math.Pow(2, attempt)),
onRetryAsync: (exception, calculatedWaitDuration, retryCount, context) =>
{
//Code
}
);
我想用断路器和大头保险来包装保险:
var circuitBreaker = Policy.Handle<HttpRequestException>().CircuitBreakerAsync(
exceptionsAllowedBeforeBreaking: maxExceptionsBeforeBreaking,
durationOfBreak: TimeSpan.FromSeconds(circuitBreakDurationSeconds),
onBreak: (exception, timespan, context) =>
{
//Code
},
onReset: (context) =>
{
//Code
}
);
var sharedBulkhead = Policy.BulkheadAsync(
maxParallelization: maxParallelizations,
maxQueuingActions: maxQueuingActions,
onBulkheadRejectedAsync: (context) =>
{
//Code
}
);
我使用以下代码将政策包装在一起:
Policy.WrapAsync(retryPolicy, circuitBreaker, sharedBulkhead);
这是一个错误:cannot convert from 'Polly.Retry.RetryPolicy<System.Net.Http.HttpResponseMessage>' to 'Polly.IAsyncPolicy'
当策略配置使用 .HandleTransientHttpError()
or .OrTransientHttpError()
, the policies are configured to handle specific status code results 执行返回 HttpResponseMessage
时。
这使得返回的策略类型满足通用接口 IAsyncPolicy<HttpResponseMessage>
而不是非通用接口 IAsyncPolicy
。
要使用 PolicyWrap static syntax 创建泛型 PolicyWrap<TResult>
,您必须明确指定泛型类型参数:
Policy.WrapAsync<HttpResponseMessage>(retryPolicy, circuitBreaker, sharedBulkhead)
如果使用PolicyWrap instance syntax,编译器通常可以推断语法。所以以下内容也应该足够了:
retryPolicy.WrapAsync(circuitBreaker).WrapAsync(sharedBulkhead)
Polly 文档在 the readme and wiki.
中涵盖了非通用策略和通用策略之间的差异。
我有以下使用 Polly.Extensions.Http
的重试策略:
var retryPolicy = Policy.Handle<BrokenCircuitException>().OrTransientHttpError().WaitAndRetryAsync
(
retryCount: maxRetryCount,
sleepDurationProvider: attempt => TimeSpan.FromSeconds(Math.Pow(2, attempt)),
onRetryAsync: (exception, calculatedWaitDuration, retryCount, context) =>
{
//Code
}
);
我想用断路器和大头保险来包装保险:
var circuitBreaker = Policy.Handle<HttpRequestException>().CircuitBreakerAsync(
exceptionsAllowedBeforeBreaking: maxExceptionsBeforeBreaking,
durationOfBreak: TimeSpan.FromSeconds(circuitBreakDurationSeconds),
onBreak: (exception, timespan, context) =>
{
//Code
},
onReset: (context) =>
{
//Code
}
);
var sharedBulkhead = Policy.BulkheadAsync(
maxParallelization: maxParallelizations,
maxQueuingActions: maxQueuingActions,
onBulkheadRejectedAsync: (context) =>
{
//Code
}
);
我使用以下代码将政策包装在一起:
Policy.WrapAsync(retryPolicy, circuitBreaker, sharedBulkhead);
这是一个错误:cannot convert from 'Polly.Retry.RetryPolicy<System.Net.Http.HttpResponseMessage>' to 'Polly.IAsyncPolicy'
当策略配置使用 .HandleTransientHttpError()
or .OrTransientHttpError()
, the policies are configured to handle specific status code results 执行返回 HttpResponseMessage
时。
这使得返回的策略类型满足通用接口 IAsyncPolicy<HttpResponseMessage>
而不是非通用接口 IAsyncPolicy
。
要使用 PolicyWrap static syntax 创建泛型 PolicyWrap<TResult>
,您必须明确指定泛型类型参数:
Policy.WrapAsync<HttpResponseMessage>(retryPolicy, circuitBreaker, sharedBulkhead)
如果使用PolicyWrap instance syntax,编译器通常可以推断语法。所以以下内容也应该足够了:
retryPolicy.WrapAsync(circuitBreaker).WrapAsync(sharedBulkhead)
Polly 文档在 the readme and wiki.
中涵盖了非通用策略和通用策略之间的差异。