private async Task RetrieveViaDicomWeb(InferenceRequest inferenceRequest, RequestInputDataResource source, Dictionary <string, InstanceStorageInfo> retrievedInstance) { Guard.Against.Null(inferenceRequest, nameof(inferenceRequest)); Guard.Against.Null(retrievedInstance, nameof(retrievedInstance)); var authenticationHeaderValue = AuthenticationHeaderValueExtensions.ConvertFrom(source.ConnectionDetails.AuthType, source.ConnectionDetails.AuthId); var dicomWebClient = new DicomWebClient(_httpClientFactory.CreateClient("dicomweb"), _loggerFactory.CreateLogger <DicomWebClient>()); dicomWebClient.ConfigureServiceUris(new Uri(source.ConnectionDetails.Uri, UriKind.Absolute)); if (!(authenticationHeaderValue is null)) { dicomWebClient.ConfigureAuthentication(authenticationHeaderValue); } foreach (var input in inferenceRequest.InputMetadata.Inputs) { switch (input.Type) { case InferenceRequestType.DicomUid: await RetrieveStudies(dicomWebClient, input.Studies, _fileSystem.Path.GetDicomStoragePath(inferenceRequest.StoragePath), retrievedInstance); break; case InferenceRequestType.DicomPatientId: await QueryStudies(dicomWebClient, inferenceRequest, retrievedInstance, $"{DicomTag.PatientID.Group:X4}{DicomTag.PatientID.Element:X4}", input.PatientId); break; case InferenceRequestType.AccessionNumber: foreach (var accessionNumber in input.AccessionNumber) { await QueryStudies(dicomWebClient, inferenceRequest, retrievedInstance, $"{DicomTag.AccessionNumber.Group:X4}{DicomTag.AccessionNumber.Element:X4}", accessionNumber); } break; case InferenceRequestType.FhireResource: continue; default: throw new InferenceRequestException($"The 'inputMetadata' type '{input.Type}' specified is not supported."); } } }
protected override async Task <OutputJob> ExportDataBlockCallback(OutputJob outputJob, CancellationToken cancellationToken) { using var loggerScope = _logger.BeginScope(new LogginDataDictionary <string, object> { { "TaskId", outputJob.TaskId }, { "JobId", outputJob.JobId }, { "PayloadId", outputJob.PayloadId } }); using var scope = _serviceScopeFactory.CreateScope(); var repository = scope.ServiceProvider.GetRequiredService <IInferenceRequestRepository>(); var inferenceRequest = repository.Get(outputJob.JobId, outputJob.PayloadId); if (inferenceRequest is null) { _logger.Log(LogLevel.Error, "The specified job cannot be found in the inference request store and will not be exported."); await ReportFailure(outputJob, cancellationToken); return(null); } var destinations = inferenceRequest.OutputResources.Where(p => p.Interface == API.Rest.InputInterfaceType.DicomWeb); if (destinations.Count() == 0) { _logger.Log(LogLevel.Error, "The inference request contains no `outputResources` nor any DICOMweb export destinations."); await ReportFailure(outputJob, cancellationToken); return(null); } foreach (var destination in destinations) { var authenticationHeader = AuthenticationHeaderValueExtensions.ConvertFrom(destination.ConnectionDetails.AuthType, destination.ConnectionDetails.AuthId); var dicomWebClient = new DicomWebClient(_httpClientFactory.CreateClient("dicomweb"), _loggerFactory.CreateLogger <DicomWebClient>()); dicomWebClient.ConfigureServiceUris(new Uri(destination.ConnectionDetails.Uri, UriKind.Absolute)); dicomWebClient.ConfigureAuthentication(authenticationHeader); _logger.Log(LogLevel.Debug, $"Exporting data to {destination.ConnectionDetails.Uri}."); await ExportToDicomWebDestination(dicomWebClient, outputJob, destination, cancellationToken); } return(outputJob); }