用Polly为令牌补水后重试

时间:2019-01-16 10:50:11

标签: c# .net-core polly

我们正在使用最新的Polly处理与三个API交互的重试和断路器策略。

基本流程为: A)从产品目录(API)读取数据 B)获取唯一商家令牌(API) C)更新商家目录(带有新项)(API)

由于Merchant Catalog API的负载(第三方,目前尚无法解决!),有时我们会跳出来。 Polly配置为可以很好地重试此操作,如果它失败并且断路器样式样式退后。

我们意识到它一直被触发,因为即使服务器吐出了假人,我们的商户令牌也被标记为无效-第三方标记了即使在错误时也使用的令牌。

阅读this article是我们最初基于解决方案的基础,我们正在考虑使用上下文重新加载/刷新auth令牌。但是我有点困惑,我如何拥有一个策略,当该逻辑不在接线(启动)中,而是在运行该策略的处理程序中时,刷新该令牌。

var authMerchTokenPolicy = Policy<HttpResponseMessage>  
  .HandleResult(r => r.StatusCode == 500)
  .RetryAsync(1, onRetryAsync: async (ex, i, context) => await RefreshMerchantAuthorization(context["httpClient"]));

上面的示例是否说明我在启动类中实现了RefreshMerchantAuthorization?

我还没有看到一个具体的例子,那就是混乱的根源-最初的开发者此后就离开了作者(讽刺地命名为Paulie!)

1 个答案:

答案 0 :(得分:0)

  

上面的示例是否说明我在启动类中实现了RefreshMerchantAuthorization?

Polly的Context类允许您使用类似Dictionary<string, object>的语义来携带任何自定义数据。因此,您还可以通过Context将处理程序类传递到策略中。

对于RefreshMerchantAuthorization(...)FooHandler上的实例方法,则可以在StartUp中配置策略:

var authMerchTokenPolicy = Policy<HttpResponseMessage>  
    .HandleResult(r => r.StatusCode == 500)
    .RetryAsync(1, onRetryAsync: async (ex, i, context) => 
        await ((FooHandler)context["handler"]).RefreshMerchantAuthorization(context["httpClient"]));

FooHandler内的策略使用站点上使用:

var httpResponseMessage =  
    await authMerchTokenPolicy.ExecuteAsync(context => context["httpClient"].GetAsync(uri), 
    contextData: new Dictionary<string, object> {
        {"httpClient", httpClient},
        {"handler", this} 
    });

所有这一切都假设未/不能将RefreshMerchantAuthorization(...)设为static(如果static可以直接从StartUp类中作为静态引用来引用)方法)。