尝试用asyncPolicy包装CircuitBreaker的回退时出错



我有IAsyncPolicy<HttpResponseMessage>,它是两个策略timeoutPolicywaitAndRetryPolicy的包装器,我将用变量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(...)语法。

相关内容

  • 没有找到相关文章

最新更新