public async Task Invoke(HttpContext context) { if (!(await _redisCache.ProcessCachedResponsePossibility(context))) { var targetUri = BuildTargetUri(context.Request); if (targetUri != null) { var targetRequestMessage = CreateTargetMessage(context, targetUri); using (var responseMessage = await _httpClient.SendAsync(targetRequestMessage, HttpCompletionOption.ResponseHeadersRead, context.RequestAborted)) { var statusCode = (int)responseMessage.StatusCode; context.Response.StatusCode = statusCode; CopyFromTargetResponseHeaders(context, responseMessage); if (isGetRequest(context) && statusCode >= 200 && statusCode <= 299) { StringValues type; if (context.Request.Headers.TryGetValue("Accept", out type)) { var key = context.Request.Path + type.First(); var content = await responseMessage.Content.ReadAsByteArrayAsync(); await _redisCache.WriteToCache(key, content); } } _loadBalancer.DecrementRequestCount(targetUri.OriginalString .Substring(0, targetUri.OriginalString.IndexOf("/api/"))); await ProcessResponseContent(context, responseMessage); } return; } await _nextMiddleware(context); } }