Пример #1
0
        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);
            }
        }