コード例 #1
0
        public static async Task <TResponsePayload> PostProtoPayload <TRequest, TResponsePayload>(this System.Net.Http.HttpClient client,
                                                                                                  string url, RequestEnvelope requestEnvelope, IApiFailureStrategy strategy) where TRequest : IMessage <TRequest>
            where TResponsePayload : IMessage <TResponsePayload>, new()
        {
            Debug.WriteLine($"Requesting {typeof(TResponsePayload).Name}");
            var response = await PostProto <TRequest>(client, url, requestEnvelope);

            while (response.Returns.Count == 0)
            {
                var operation = await strategy.HandleApiFailure(requestEnvelope, response);

                if (operation == ApiOperation.Abort)
                {
                    break;
                }

                response = await PostProto <TRequest>(client, url, requestEnvelope);
            }

            if (response.Returns.Count == 0)
            {
                throw new InvalidResponseException();
            }

            strategy.HandleApiSuccess(requestEnvelope, response);

            //Decode payload
            //todo: multi-payload support
            var payload       = response.Returns[0];
            var parsedPayload = new TResponsePayload();

            parsedPayload.MergeFrom(payload);

            return(parsedPayload);
        }
コード例 #2
0
        public static async Task <IMessage[]> PostProtoPayload <TRequest>(this System.Net.Http.HttpClient client,
                                                                          string url, RequestEnvelope requestEnvelope,
                                                                          IApiFailureStrategy strategy,
                                                                          params Type[] responseTypes) where TRequest : IMessage <TRequest>
        {
            var result = new IMessage[responseTypes.Length];

            for (var i = 0; i < responseTypes.Length; i++)
            {
                result[i] = Activator.CreateInstance(responseTypes[i]) as IMessage;
                if (result[i] == null)
                {
                    throw new ArgumentException($"ResponseType {i} is not an IMessage");
                }
            }

            //check if the last request was sent less than 350ms ago
            if (_delayTime.HasValue && _delayTime.Value > DateTime.Now)
            {
                //delay as needed
                await Task.Delay(_delayTime.Value.Subtract(DateTime.Now));
            }

            ResponseEnvelope response;

            while ((response = await PostProto <TRequest>(client, url, requestEnvelope)).Returns.Count != responseTypes.Length)
            {
                var operation = await strategy.HandleApiFailure(requestEnvelope, response);

                if (operation == ApiOperation.Abort)
                {
                    throw new InvalidResponseException($"Expected {responseTypes.Length} responses, but got {response.Returns.Count} responses");
                }
            }

            //set _delay time ahed 350ms
            _delayTime = DateTime.Now.AddMilliseconds(450);

            strategy.HandleApiSuccess(requestEnvelope, response);

            for (var i = 0; i < responseTypes.Length; i++)
            {
                var payload = response.Returns[i];
                result[i].MergeFrom(payload);
            }
            return(result);
        }
コード例 #3
0
        public static async Task <IMessage[]> PostProtoPayload <TRequest>(this System.Net.Http.HttpClient client,
                                                                          string url, RequestEnvelope requestEnvelope,
                                                                          IApiFailureStrategy strategy,
                                                                          params Type[] responseTypes) where TRequest : IMessage <TRequest>
        {
            var result = new IMessage[responseTypes.Length];

            for (var i = 0; i < responseTypes.Length; i++)
            {
                result[i] = Activator.CreateInstance(responseTypes[i]) as IMessage;
                if (result[i] == null)
                {
                    throw new ArgumentException($"ResponseType {i} is not an IMessage");
                }
            }

            ResponseEnvelope response;

            while ((response = await PostProto <TRequest>(client, url, requestEnvelope)).Returns.Count != responseTypes.Length)
            {
                var operation = await strategy.HandleApiFailure(requestEnvelope, response);

                if (operation == ApiOperation.Abort)
                {
                    throw new InvalidResponseException($"Expected {responseTypes.Length} responses, but got {response.Returns.Count} responses");
                }
            }

            strategy.HandleApiSuccess(requestEnvelope, response);

            for (var i = 0; i < responseTypes.Length; i++)
            {
                var payload = response.Returns[i];
                result[i].MergeFrom(payload);
            }

            //Logger.Error(result.ToString());

            return(result);
        }
コード例 #4
0
ファイル: Client.cs プロジェクト: ArthurSDev/Po
        public async Task <TResponsePayload> PostProtoPayload <TRequest, TResponsePayload>(string url, RequestEnvelope requestEnvelope, IApiFailureStrategy strategy)
            where TRequest : IMessage <TRequest>
            where TResponsePayload : IMessage <TResponsePayload>, new()
        {
            Debug.WriteLine($"Requesting {typeof(TResponsePayload).Name}");
            var urlArray = new[] { url };

            var response = await PostProto <TRequest>(url, requestEnvelope);

            while (response.Returns.Count == 0)
            {
                var operation = await strategy.HandleApiFailure(urlArray, requestEnvelope, response);

                if (operation == ApiOperation.Abort)
                {
                    break;
                }

                response = await PostProto <TRequest>(urlArray[0], requestEnvelope);
            }

            // TODO: statuscode = 3 probably means ban!
            if (response.Returns.Count == 0)
            {
                throw new InvalidResponseException();
            }

            strategy.HandleApiSuccess(requestEnvelope, response);

            //Decode payload
            //todo: multi-payload support
            var payload       = response.Returns[0];
            var parsedPayload = new TResponsePayload();

            parsedPayload.MergeFrom(payload);

            return(parsedPayload);
        }
コード例 #5
0
        public static TResponsePayload PostProtoPayload <TRequest, TResponsePayload>(
            this System.Net.Http.HttpClient httpClient,
            string url, RequestEnvelope requestEnvelope, IApiFailureStrategy strategy)
            where TRequest : IMessage <TRequest>
            where TResponsePayload : IMessage <TResponsePayload>, new()
        {
            var response = PerformThrottledRemoteProcedureCall <TRequest>(httpClient, url, requestEnvelope).Result;

            while (response.Returns.Count == 0)
            {
                Logger.Debug("Handling Failure");
                var operation = strategy.HandleApiFailure(requestEnvelope, response);

                if (operation == ApiOperation.Abort)
                {
                    break;
                }

                response = PerformThrottledRemoteProcedureCall <TRequest>(httpClient, url, requestEnvelope).Result;
            }

            if (response.Returns.Count == 0)
            {
                throw new InvalidResponseException();
            }

            strategy.HandleApiSuccess(requestEnvelope, response);

            //Decode payload
            //TODO: multi-payload support
            var payload       = response.Returns[0];
            var parsedPayload = new TResponsePayload();

            parsedPayload.MergeFrom(payload);

            return(parsedPayload);
        }