Повторите попытку после регидратации токена Полли - PullRequest
0 голосов
/ 16 января 2019

Мы используем последнюю версию Polly для обработки наших политик повторных попыток и выключателей для взаимодействия с тремя API.

Основной поток: А) Чтение данных из каталога продукции (API) Б) Получить уникальный торговый маркер (API) C) Обновить каталог продавца (с новым элементом) (API)

Из-за загруженности API Merchant Catalog (сторонней, пока не можем обойти это!) Мы иногда получаем отскок. Полли настроена на повторную попытку в случае сбоя и стиль шаблона автоматического выключателя, отключите его.

Мы поняли, что он был отключен последовательно, потому что наш Торговый токен был помечен как недействительный, даже если сервер выдал пустышку - третье лицо помечает токен, используемый даже при ошибке.

Чтение этой статьи , на которой мы изначально основали наше решение, мы думаем, используя контекст для перезагрузки / обновления токена аутентификации. Однако я немного сбит с толку, как у меня может быть политика, которая обновляет этот токен, когда эта логика находится не в подключении (запуске), а в обработчике, запускающем политику.

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

Указывает ли приведенный выше пример, что я реализую RefreshMerchantAuthorization в классе запуска?

Я не видел конкретного примера, в котором заключается путаница - и с тех пор ушел оригинальный разработчик, который написал это (по иронии судьбы по имени Поли!)

1 Ответ

0 голосов
/ 16 января 2019

Указывает ли приведенный выше пример, что я реализую RefreshMerchantAuthorization в классе запуска?

Класс 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 как статического метода).

...