Пример #1
0
        private async Task <AntCloudClientResponse> SendRequest(AntCloudClientRequest request)
        {
            var retried = 0;

            var parameters = request.GetParameters();
            var message    = BuildRequest(_endpoint, parameters);

            while (true)
            {
                RequestSending?.Invoke(this, parameters);

                var response = await _httpClient.SendAsync(message);

                var responseString = await response.Content.ReadAsStringAsync();

                ResponseRead?.Invoke(this, responseString);

                JObject wholeJson;
                try
                {
                    wholeJson = JObject.Parse(responseString);
                }
                catch (JsonReaderException e)
                {
                    if (_enableAutoRetry && retried < _autoRetryLimit)
                    {
                        retried += 1;
                        continue;
                    }
                    throw new ClientException(SDKConstants.ResultCodes.RESPONSE_FORMAT_ERROR, e.Message);
                }

                if (wholeJson == null)
                {
                    throw new ClientException(SDKConstants.ResultCodes.TRANSPORT_ERROR, "Unexpected gateway response: " + responseString);
                }

                var responseNode = wholeJson["response"] as JObject;
                if (responseNode == null)
                {
                    throw new ClientException(SDKConstants.ResultCodes.TRANSPORT_ERROR, "Unexpected gateway response: " + responseString);
                }

                var result = AntCloudClientResponse.Create(responseNode);
                if (result.IsSuccess && _checkSign)
                {
                    var sign           = wholeJson.Value <string>(SDKConstants.ParamKeys.SIGN);
                    var target         = ExtractStringToSign(responseString);
                    var calculatedSign = ComputeSign(target, request.GetParameter(SDKConstants.ParamKeys.SIGN_TYPE), _accessSecret, SDKConstants.SIGN_CHARSET);

                    if (!calculatedSign.Equals(sign))
                    {
                        throw new ClientException(SDKConstants.ResultCodes.BAD_SIGNATURE, "Invalid signature in response");
                    }
                }

                return(result);
            }
        }
        /// <summary>
        /// Raises the <see cref="RequestSending"/> event. Note, sender is null.
        /// </summary>
        /// <param name="inUri"></param>
        internal static void onRequestSending(Uri inUri)
        {
            // Written, 24.11.2019

            onSendingStopWatch.Restart();
            Console.WriteLine("Requesting from the URL, {0}", inUri.AbsoluteUri.Replace(ApplicationInfomation.API_KEY, "<api_key>"));
            RequestSending?.Invoke(null, new RequestSendingEventArgs(inUri));
        }
Пример #3
0
        public async Task <TResponse> SendRequest(TRequest request)
        {
            var sw = new Stopwatch();

            sw.Start();

            var sessionId = Guid.NewGuid().ToString("N");

            var message = Helpers.CreateMessage(request);

            message.ReplyTo          = receiveResponseQueueName;
            message.ReplyToSessionId = sessionId;

            var sessionClient  = new SessionClient(connectionStr, receiveResponseQueueName);
            var messageSession = await sessionClient.AcceptMessageSessionAsync(sessionId);

            var receiveTask = messageSession.ReceiveAsync(TimeSpan.FromSeconds(20));

            // SEND!
            RequestSending?.Invoke(request, message);
            await client.SendAsync(message);

            // RECEIVE!
            var responseMsg = await receiveTask;
            await messageSession.CloseAsync();

            sw.Stop();
            AverageRTTms = (AverageRTTms * sendCount + sw.ElapsedMilliseconds) / (++sendCount);
            if (sw.ElapsedMilliseconds < MinRTTms || MinRTTms == 0)
            {
                MinRTTms = sw.ElapsedMilliseconds;
            }
            if (sw.ElapsedMilliseconds > MaxRTTms)
            {
                MaxRTTms = sw.ElapsedMilliseconds;
            }

            return(Helpers.DecodeMessage <TResponse>(responseMsg));
        }
Пример #4
0
 public virtual void OnRequestSending(WebEventArgs e)
 {
     RequestSending?.Invoke(e.Context, e);
 }
Пример #5
0
 protected virtual void OnRequestSending(RequestSendingEventArgs @event)
 {
     RequestSending?.Invoke(this, @event);
 }