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}"); }