Esempio n. 1
0
        protected R GetServiceData <T, R>(Func <T, R> func, T request)
            where T : AbstractRequestType
            where R : AbstractResponseType
        {
            request.Version = ApiVersion.Value;

            var errorRetryingInfo  = Info.Settings == null ? null : Info.Settings.ErrorRetryingInfo;
            var retryingController = new WaitBeforeRetryController(new ErrorRetryingWaiter(), errorRetryingInfo);

            return(retryingController.Do(() =>
            {
                WriteLog(string.Format("Request to eBay: {0} started", CallProcedureName));
                R response;
                try
                {
                    response = func(request);
                }
                catch (SoapException ex)
                {
                    ServiceFaultDetail fault;

                    if (ServiceRequestException.TryExtractErrorMessage(ex, out fault))
                    {
                        throw ServiceRequestExceptionFactory.Create(fault, ex);
                    }

                    throw;
                }

                if (response.Ack == AckCodeType.Failure)
                {
                    throw ServiceRequestExceptionFactory.Create(new AmazonServiceResponceExceptionWrapper(response));
                }

                WriteLog(string.Format("Request to eBay: {0} ended successfuly", CallProcedureName));
                return response;
            },
                                         ex =>
            {
                WriteLog(string.Format("Request to eBay: {0} ended with error", CallProcedureName), ex);

                if (ex is IServiceRequestException)
                {
                    var exFail = ex as IServiceRequestException;
                    return _CommonInternalErrors.Any(exFail.HasErrorWithCode);
                }

                return true;
            }));
        }
            private Task <HttpResponseMessage> ExecuteAsyncContinueWith(Task <HttpResponseMessage> runningTask)
            {
                if (!runningTask.IsFaulted || this.cancellationToken.IsCancellationRequested)
                {
                    var response = runningTask.Result;

                    if (!response.IsSuccessStatusCode)
                    {
                        if ((int)response.StatusCode == 429)
                        {
                            var delay = response.Headers.RetryAfter.Delta.Value + TimeSpan.FromSeconds(1);
                            this.previousTask = runningTask;

                            return(Task.Delay(delay, this.cancellationToken)
                                   .ContinueWith(this.ExecuteAsyncImpl, CancellationToken.None,
                                                 TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default)
                                   .Unwrap());
                        }
                        return(ServiceRequestException.ConvertResponseAsync(response));
                    }
                    IEnumerable <string> values;
                    if (response.Headers.TryGetValues("X-RateLimit-Remaining", out values) && values.Any())
                    {
                        if (Convert.ToInt32(values.First()) == 0)
                        {
                            if (response.Headers.TryGetValues("X-RateLimit-Reset", out values) && values.Any())
                            {
                                var delayTicks = UnixEpochTicks + (Convert.ToInt64(values.First()) + 1) * TimeSpan.TicksPerSecond - DateTime.UtcNow.Ticks;
                                this.previousTask = runningTask;

                                return(Task.Delay(TimeSpan.FromTicks(delayTicks), this.cancellationToken)
                                       .ContinueWith(this.ExecuteAsyncImpl, CancellationToken.None,
                                                     TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default)
                                       .Unwrap());
                            }
                        }
                    }
                    return(runningTask);
                }
                else
                {
                    TaskCompletionSource <HttpResponseMessage> tcs = new TaskCompletionSource <HttpResponseMessage>();
                    tcs.TrySetException(runningTask.Exception);
                    return(tcs.Task);
                }
            }
 public ServiceResponse(ServiceRequestException serviceRequestException)
 {
     _serviceRequestException = serviceRequestException;
 }