[英]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.