diff --git a/src/Ocelot/Requester/HttpClientHttpRequester.cs b/src/Ocelot/Requester/HttpClientHttpRequester.cs index 0cf6a053..8188ae0c 100644 --- a/src/Ocelot/Requester/HttpClientHttpRequester.cs +++ b/src/Ocelot/Requester/HttpClientHttpRequester.cs @@ -22,17 +22,7 @@ namespace Ocelot.Requester public async Task> GetResponse(Request.Request request) { - var builder = new HttpClientBuilder(); - - var cacheKey = GetCacheKey(request, builder); - - var httpClient = _cacheHandlers.Get(cacheKey); - if (httpClient == null) - { - httpClient = builder.Create(); - _cacheHandlers.Set(cacheKey, httpClient, TimeSpan.FromHours(6)); - } - + IHttpClient httpClient = GetHttpClient(request); try { var response = await httpClient.SendAsync(request.HttpRequestMessage); @@ -55,6 +45,19 @@ namespace Ocelot.Requester } + private IHttpClient GetHttpClient(Request.Request request) + { + var builder = new HttpClientBuilder(); + var cacheKey = GetCacheKey(request, builder); + var httpClient = _cacheHandlers.Get(cacheKey); + if (httpClient == null) + { + httpClient = builder.Create(); + } + _cacheHandlers.Set(cacheKey, httpClient, TimeSpan.FromHours(6)); + return httpClient; + } + private string GetCacheKey(Request.Request request, IHttpClientBuilder builder) { string baseUrl = $"{request.HttpRequestMessage.RequestUri.Scheme}://{request.HttpRequestMessage.RequestUri.Authority}"; diff --git a/src/Ocelot/Requester/MemoryHttpClientCache.cs b/src/Ocelot/Requester/MemoryHttpClientCache.cs index 33ff15a1..2000b7b4 100644 --- a/src/Ocelot/Requester/MemoryHttpClientCache.cs +++ b/src/Ocelot/Requester/MemoryHttpClientCache.cs @@ -1,5 +1,6 @@ using Microsoft.Extensions.Caching.Memory; using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Net.Http; @@ -9,38 +10,44 @@ namespace Ocelot.Requester { public class MemoryHttpClientCache : IHttpClientCache { - private readonly IMemoryCache _memoryCache; - - public MemoryHttpClientCache(IMemoryCache memoryCache) - { - _memoryCache = memoryCache; - } + private readonly ConcurrentDictionary> _httpClientsCache = new ConcurrentDictionary>(); public void Set(string id, IHttpClient client, TimeSpan expirationTime) { - _memoryCache.Set(id, client, new MemoryCacheEntryOptions().SetAbsoluteExpiration(expirationTime)); + ConcurrentQueue connectionQueue; + if (_httpClientsCache.TryGetValue(id, out connectionQueue)) + { + connectionQueue.Enqueue(client); + } + else + { + connectionQueue = new ConcurrentQueue(); + connectionQueue.Enqueue(client); + _httpClientsCache.TryAdd(id, connectionQueue); + } } public bool Exists(string id) { - IHttpClient counter; - return _memoryCache.TryGetValue(id, out counter); + ConcurrentQueue connectionQueue; + return _httpClientsCache.TryGetValue(id, out connectionQueue); } public IHttpClient Get(string id) { - IHttpClient counter; - if (_memoryCache.TryGetValue(id, out counter)) + IHttpClient client= null; + ConcurrentQueue connectionQueue; + if (_httpClientsCache.TryGetValue(id, out connectionQueue)) { - return counter; + connectionQueue.TryDequeue(out client); } - - return null; + return client; } public void Remove(string id) { - _memoryCache.Remove(id); - } + ConcurrentQueue connectionQueue; + _httpClientsCache.TryRemove(id, out connectionQueue); + } } }