in src/Microsoft.Health.Dicom.Core/Features/Store/StoreService.cs [99:168]
private async Task ProcessDicomInstanceEntryAsync(int index, CancellationToken cancellationToken)
{
IDicomInstanceEntry dicomInstanceEntry = _dicomInstanceEntries[index];
DicomDataset dicomDataset = null;
try
{
// Open and validate the DICOM instance.
dicomDataset = await dicomInstanceEntry.GetDicomDatasetAsync(cancellationToken);
await _dicomDatasetValidator.ValidateAsync(dicomDataset, _requiredStudyInstanceUid, cancellationToken);
}
catch (Exception ex)
{
ushort failureCode = FailureReasonCodes.ProcessingFailure;
switch (ex)
{
case DicomValidationException _:
failureCode = FailureReasonCodes.ValidationFailure;
break;
case DatasetValidationException dicomDatasetValidationException:
failureCode = dicomDatasetValidationException.FailureCode;
break;
case ValidationException _:
failureCode = FailureReasonCodes.ValidationFailure;
break;
}
LogValidationFailedDelegate(_logger, index, failureCode, ex);
_storeResponseBuilder.AddFailure(dicomDataset, failureCode);
return;
}
try
{
// Store the instance.
await _storeOrchestrator.StoreDicomInstanceEntryAsync(
dicomInstanceEntry,
cancellationToken);
LogSuccessfullyStoredDelegate(_logger, index, null);
_storeResponseBuilder.AddSuccess(dicomDataset);
}
catch (Exception ex)
{
ushort failureCode = FailureReasonCodes.ProcessingFailure;
switch (ex)
{
case PendingInstanceException _:
failureCode = FailureReasonCodes.PendingSopInstance;
break;
case InstanceAlreadyExistsException _:
failureCode = FailureReasonCodes.SopInstanceAlreadyExists;
break;
}
LogFailedToStoreDelegate(_logger, index, failureCode, ex);
_storeResponseBuilder.AddFailure(dicomDataset, failureCode);
}
}