我们正在使用最新的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!)
答案 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
类中作为静态引用来引用)方法)。