コード例 #1
0
        public async Task Invoke(HttpContext context,
                                 DiscoveryOptions discoveryOptions,
                                 INodeDiscoveryProvider discoveryProvider)
        {
            _discoveryProvider = discoveryProvider;

            var request      = context.Request;
            var pathMatch    = discoveryOptions.MatchPath;
            var isCapRequest = request.Path.StartsWithSegments(new PathString(pathMatch));

            if (!isCapRequest)
            {
                await _next.Invoke(context);
            }
            else
            {
                //For performance reasons, we need to put this functionality in the else
                var isSwitchNode  = request.Cookies.TryGetValue(NodeCookieName, out var requestNodeId);
                var isCurrentNode = discoveryOptions.NodeId.ToString() == requestNodeId;
                var isNodesPage   = request.Path.StartsWithSegments(new PathString(pathMatch + "/nodes"));

                if (!isSwitchNode || isCurrentNode || isNodesPage)
                {
                    await _next.Invoke(context);
                }
                else
                {
                    _logger.LogDebug("started calling gateway proxy middleware");

                    if (TryGetRemoteNode(requestNodeId, out var node))
                    {
                        try
                        {
                            DownstreamRequest = await _requestMapper.Map(request);

                            SetDownStreamRequestUri(node, request.Path.Value);

                            var response = await _requester.GetResponse(DownstreamRequest);

                            await SetResponseOnHttpContext(context, response);
                        }
                        catch (Exception ex)
                        {
                            _logger.LogError(ex.Message);
                        }
                    }
                    else
                    {
                        context.Response.Cookies.Delete(NodeCookieName);
                        await _next.Invoke(context);
                    }
                }
            }
        }
コード例 #2
0
 public ConsulProcessingNodeServer(INodeDiscoveryProvider discoveryProvider)
 {
     _discoveryProvider = discoveryProvider;
 }