我有IAsyncPolicy<HttpResponseMessage>
,它是两个策略timeoutPolicy
和waitAndRetryPolicy
的包装器,我将用变量asyncPolicy
返回这两个策略。
现在我有另一个策略fallbackForCircuitBreaker
,我想用asyncPolicy
包装它,但这给了我以下错误,
异步策略<HttpResponseMessage>'不包含"WrapAsync"和最佳扩展方法重载"IAsyncPolicyPolicyWrapExtensions.RapAsync<HttpResponseMessage>(IAsyncPolicy,IAsyncPolicy('需要类型为"IAsyncPolicy"的接收器
这意味着什么以及如何解决?
static void Main(string[] args)
{
var asyncPolicy = CreateDefaultRetryPolicy();
var fallbackForCircuitBreaker = Policy<bool>
.Handle<BrokenCircuitException>()
.OrInner<BrokenCircuitException>()
.Fallback(fallbackValue: false, onFallback: (b, context) => { Console.WriteLine("test"); });
var X = asyncPolicy.WrapAsync<HttpResponseMessage>(fallbackForCircuitBreaker);
Console.ReadKey();
}
public static IAsyncPolicy<HttpResponseMessage> CreateDefaultRetryPolicy()
{
var timeoutPolicy = Policy.TimeoutAsync(TimeSpan.FromSeconds(180));
var waitAndRetryPolicy = Polly.Policy
.Handle<HttpRequestException>()
.OrResult<HttpResponseMessage>(r => r.StatusCode == HttpStatusCode.InternalServerError)
.WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(3, retryAttempt)),
(result, timeSpan, context) =>{});
return timeoutPolicy.WrapAsync(waitAndRetryPolicy);
}
在PolicyWrap中组合通用策略时,只能将返回相同TResult
类型的调用的策略打包在一起。
您发布的代码试图将一个管理返回HttpResponseMessage
的调用的策略与一个控制返回bool
的调用的政策组合在一起。
换句话说:您不能使用FallbackPolicy在PolicyWrap中间转换调用的返回类型。
如果您的目标是捕获执行的结果,以及是否成功的总体状态/布尔值,请参阅Polly自述文件中介绍的.ExecuteAndCaptureAsync(...)
语法。