public async Task <PayloadFile> Download(string payload, string name) { Guard.Against.NullOrWhiteSpace(payload, nameof(payload)); Guard.Against.NullOrWhiteSpace(name, nameof(name)); if (!PayloadId.TryParse(payload, out PayloadId payloadId)) { throw new ArgumentException($"Invalid Payload ID received: {payload}"); } return(await Policy <PayloadFile> .Handle <Exception>() .WaitAndRetryAsync(3, (r) => TimeSpan.FromSeconds(r * 1.5f), (data, retryCount, context) => { _logger.Log(LogLevel.Error, "Failed to download file {0} from Payloads Service {1}: {2}", name, payload, data.Exception); }) .ExecuteAsync(async() => { PayloadFile file = new PayloadFile(); using (var ms = new MemoryStream()) { var details = await _payloadsClient.DownloadFrom(payloadId, name, ms); file.Data = ms.ToArray(); file.Name = details.Name; } _logger.Log(LogLevel.Information, "File {0} successfully downloaded from {1}.", name, payloadId); return file; }).ConfigureAwait(false)); }
private async Task DownloadFromPayloadsService(OutputJob job) { int failureCount = 0; foreach (var url in job.Uris) { PayloadFile file = null; try { file = await _payloadsApi.Download(job.PayloadId, url); } catch (System.Exception ex) { job.Logger.LogWarning("Failed to download file {0} from payload {1}: {2}", url, job.PayloadId, ex); job.FailedFiles.Add(url); failureCount++; continue; } try { var dicom = DicomFile.Open(new MemoryStream(file.Data)); job.PendingDicomFiles.Enqueue(dicom); } catch (System.Exception ex) { job.Logger.LogWarning("Failed to load DICOM data {0} from payload {1}: {2}", url, job.PayloadId, ex); job.FailedFiles.Add(url); failureCount++; } } if (failureCount > 1) { job.Logger.LogWarning("{0}/{1} files failed to load.", failureCount, job.Uris.Count()); } }