public override async Task <HttpResponseMessage> ReqApiAsync(HttpMethod httpMethod, string path, Dictionary <string, string> headers, Dictionary <string, string> paramValues, int timeout)
        {
            using (HttpClient client = new HttpClient())
            {
                client.Timeout = TimeSpan.FromSeconds(timeout);

                var requestMessage = new HttpRequestMessage
                {
                    Method = httpMethod
                };

                var currentServerAddr = _serverListMgr.GetCurrentServerAddr();

                var requestUrl = GetUrl(currentServerAddr, path);

                InjectSecurityInfo(requestMessage, paramValues);

                if (paramValues != null && paramValues.Any())
                {
                    if (httpMethod == HttpMethod.Post)
                    {
                        requestMessage.RequestUri = new Uri(requestUrl);
                        requestMessage.Content    = new FormUrlEncodedContent(paramValues);
                    }
                    else
                    {
                        var query = HttpAgentCommon.BuildQueryString(paramValues);
                        requestMessage.RequestUri = new Uri($"{requestUrl}?{query}");
                    }
                }

                HttpAgentCommon.BuildHeader(requestMessage, headers);
                HttpAgentCommon.BuildSpasHeaders(requestMessage, paramValues, _options.AccessKey, _options.SecretKey);



                var responseMessage = await client.SendAsync(requestMessage);

                if (responseMessage.StatusCode == System.Net.HttpStatusCode.InternalServerError ||
                    responseMessage.StatusCode == System.Net.HttpStatusCode.BadGateway ||
                    responseMessage.StatusCode == System.Net.HttpStatusCode.ServiceUnavailable)
                {
                    System.Diagnostics.Trace.TraceError("[NACOS ConnectException] currentServerAddr: {0}, httpCode: {1}", _serverListMgr.GetCurrentServerAddr(), responseMessage.StatusCode);
                }
                else
                {
                    _serverListMgr.UpdateCurrentServerAddr(currentServerAddr);
                    return(responseMessage);
                }

                throw new System.Net.Http.HttpRequestException($"no available server, currentServerAddr : {currentServerAddr}");
            }
        }
        public async Task <HttpResponseMessage> HttpRequest(string path, Dictionary <string, string> headers, Dictionary <string, string> paramValues, string encoding, long readTimeoutMs, HttpMethod method)
        {
            long endTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() + readTimeoutMs;

            string currentServerAddr = _serverListMgr.GetCurrentServerAddr();
            int    maxRetry          = Constants.MAX_RETRY;

            var requestUrl = $"{GetUrl(currentServerAddr, path)}?{InitParams(paramValues)}";

            do
            {
                try
                {
                    var cts = new System.Threading.CancellationTokenSource();
                    cts.CancelAfter(TimeSpan.FromMilliseconds(readTimeoutMs));

                    HttpRequestMessage reqMsg = new HttpRequestMessage(method, requestUrl);
                    foreach (var item in headers)
                    {
                        reqMsg.Headers.TryAddWithoutValidation(item.Key, item.Value);
                    }

                    var resp = await _httpClient.SendAsync(reqMsg, cts.Token).ConfigureAwait(false);

                    if (IsFail(resp))
                    {
                        _logger?.LogError("[NACOS ConnectException] currentServerAddr: {0}, httpCode: {1}", currentServerAddr, resp.StatusCode);
                    }
                    else
                    {
                        _serverListMgr.UpdateCurrentServerAddr(currentServerAddr);
                        return(resp);
                    }
                }
                catch (Exception ex)
                {
                    _logger?.LogError(ex, "[NACOS Exception {0}] currentServerAddr: {1}", method.Method, currentServerAddr);
                }

                maxRetry--;
                if (maxRetry < 0)
                {
                    throw new Exception(
                              $"[NACOS HTTP-{method.Method}] The maximum number of tolerable server reconnection errors has been reached");
                }

                _serverListMgr.RefreshCurrentServerAddr();
            }while (DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() <= endTime);

            _logger?.LogError("no available server");
            throw new Exception("no available server");
        }
        public override async Task <HttpResponseMessage> ReqApiAsync(HttpMethod httpMethod, string path, Dictionary <string, string> headers, Dictionary <string, string> paramValues, CancellationToken cancellationToken)
        {
            var client = _clientFactory.CreateClient(ConstValue.ClientName);

            client.Timeout = Timeout.InfiniteTimeSpan;

            var requestMessage = new HttpRequestMessage
            {
                Method = httpMethod
            };

            var currentServerAddr = _serverListMgr.GetCurrentServerAddr();

            var requestUrl = GetUrl(currentServerAddr, path);

            InjectSecurityInfo(requestMessage, paramValues);

            if (paramValues != null && paramValues.Any())
            {
                if (httpMethod == HttpMethod.Post)
                {
                    requestMessage.RequestUri = new Uri(requestUrl);
                    requestMessage.Content    = new FormUrlEncodedContent(paramValues);
                }
                else
                {
                    var query = HttpAgentCommon.BuildQueryString(paramValues);
                    requestMessage.RequestUri = new Uri($"{requestUrl}?{query}");
                }
            }

            HttpAgentCommon.BuildHeader(requestMessage, headers);
            HttpAgentCommon.BuildSpasHeaders(requestMessage, paramValues, _options.AccessKey, _options.SecretKey);

            var responseMessage = await client.SendAsync(requestMessage, cancellationToken).ConfigureAwait(false);

            if (responseMessage.StatusCode == System.Net.HttpStatusCode.InternalServerError ||
                responseMessage.StatusCode == System.Net.HttpStatusCode.BadGateway ||
                responseMessage.StatusCode == System.Net.HttpStatusCode.ServiceUnavailable)
            {
                _logger?.LogError("[NACOS ConnectException] currentServerAddr: {0}, httpCode: {1}", _serverListMgr.GetCurrentServerAddr(), responseMessage.StatusCode);
            }
            else
            {
                _serverListMgr.UpdateCurrentServerAddr(currentServerAddr);
                return(responseMessage);
            }

            throw new System.Net.Http.HttpRequestException($"no available server, currentServerAddr : {currentServerAddr}");
        }