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