繁体   English   中英

用Polly为令牌补水后重试

[英]Retry after rehydrating token with polly

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

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

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

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

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

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

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

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

上面的示例说明我在启动类中实现了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类作为静态方法进行引用)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM