diff --git a/src/BuildingBlocks/Resilience/Resilience.Http/ResilientHttpClient.cs b/src/BuildingBlocks/Resilience/Resilience.Http/ResilientHttpClient.cs index 88f6cb1d6..d1b34f49a 100644 --- a/src/BuildingBlocks/Resilience/Resilience.Http/ResilientHttpClient.cs +++ b/src/BuildingBlocks/Resilience/Resilience.Http/ResilientHttpClient.cs @@ -3,7 +3,6 @@ using Newtonsoft.Json; using Polly; using Polly.Wrap; using System; -using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Net; @@ -20,18 +19,15 @@ namespace Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http /// public class ResilientHttpClient : IHttpClient { - private HttpClient _client; - private readonly ConcurrentDictionary _policiesPerOrigin; - private ILogger _logger; - private readonly Func> _policyCreator; + private readonly HttpClient _client; + private readonly ILogger _logger; + private PolicyWrap _policyWrap; - - public ResilientHttpClient(Func> policyCreator, ILogger logger) + public ResilientHttpClient(IEnumerable policies, ILogger logger) { _client = new HttpClient(); _logger = logger; - _policiesPerOrigin = new ConcurrentDictionary(); - _policyCreator = policyCreator; + _policyWrap = Policy.Wrap(policies.ToArray()); } @@ -128,36 +124,15 @@ namespace Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http } private Task HttpInvoker(string origin, Func> action) - { - var policyWrapper = GetPolicyForOrigin(origin); - - if (policyWrapper != null) - { - // Executes the action applying all - // the policies defined in the wrapper - return policyWrapper.ExecuteAsync(() => action()); - } - else - { - throw new InvalidOperationException($"PolicyWrapper can't be created for origin {origin}"); - } - } - - private PolicyWrap GetPolicyForOrigin(string origin) { var normalizedOrigin = NormalizeOrigin(origin); - if (!_policiesPerOrigin.TryGetValue(normalizedOrigin, out PolicyWrap policyWrapper)) - { - policyWrapper = Policy.WrapAsync(_policyCreator(normalizedOrigin) - .ToArray()); - - _policiesPerOrigin.TryAdd(normalizedOrigin, policyWrapper); - } - - return policyWrapper; + // Executes the action applying all + // the policies defined in the wrapper + return _policyWrap.ExecuteAsync(() => action(), new Context(normalizedOrigin)); } + private static string NormalizeOrigin(string origin) { return origin?.Trim()?.ToLower(); diff --git a/src/Web/WebMVC/Infrastructure/ResilientHttpClientFactory.cs b/src/Web/WebMVC/Infrastructure/ResilientHttpClientFactory.cs index 8eb43179d..8efadf366 100644 --- a/src/Web/WebMVC/Infrastructure/ResilientHttpClientFactory.cs +++ b/src/Web/WebMVC/Infrastructure/ResilientHttpClientFactory.cs @@ -17,7 +17,7 @@ namespace Microsoft.eShopOnContainers.WebMVC.Infrastructure =>_logger = logger; public ResilientHttpClient CreateResilientHttpClient() - => new ResilientHttpClient((origin) => CreatePolicies(), _logger); + => new ResilientHttpClient(CreatePolicies(), _logger); private Policy[] CreatePolicies()